脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 用python生成一张壁纸实例代码

用python生成一张壁纸实例代码

2022-09-16 11:04橙橙小狸猫 Python

大家好,本篇文章主要讲的是用python生成一张壁纸实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

前言

之前在csdn上看见用python写春联的,这次突发奇想用python制作一张壁纸,其元素包括背景、文字、图片。

知识点 用PIL创建一张纯色背景Image.new;图片上添加文字ImageDraw,cv2只能显示英文;转换图片的透明度;图片上叠加图片;jpg与png的区别。

代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import os
from PIL import ImageFont, ImageDraw, Image
import cv2
import random
 
def white2transparent(img):
    """
    将白色部分设置为透明
    :param img: 需要修改的图片
    :return: 修改后的图片
    """
    # Image读取形式----------------------------------------------
    # img = img.convert('RGBA')
    # img = img.convert("RGBA")  # 转换格式,确保像素包含alpha通道
    # 加一个判断,不是四通道就推出
    # width, height = img.size  # 长度和宽度
    # for i in range(0, width):  # 遍历所有长度的点
    #     for j in range(0, height):  # 遍历所有宽度的点
    #         data = img.getpixel((i, j))  # 获取一个像素
    #         if (data.count(0) == 4):  # RGBA都是255,改成透明色
    #             img.putpixel((i, j), (255, 255, 255, 255))
    # return img
    # CV2读取形式----------------------------------------------
    width, height = img.shape[:2# 长度和宽度
    for i in range(0, width):  # 遍历所有长度的点
        for j in range(0, height):  # 遍历所有宽度的点
            if (img[i, j, 0], img[i, j, 1], img[i, j, 2]) == (255, 255, 255):
                img[i, j, 3] = 0
    return img
 
 
def merge_img(bg_img, target_img, x1, y1):
    """
    将图片与背景图片融合
    :param bg_img: 背景图片,要求4通道
    :param target_img: 目标图片,要求四通道
    :param x1: target_img在bg_img的坐标,如果需要调节图片大小,请在函数外resize
    :param y1:
    :return:
    """
 
    # 判断jpg图像是否已经为4通道
    if bg_img.shape[2] == 3 or target_img.shape[2] == 3:
        print("merge image error, image must 4 channels.")
        return
 
    '''
    当叠加图像时,可能因为叠加位置设置不当,导致png图像的边界超过背景jpg图像,而程序报错
    这里设定一系列叠加位置的限制,可以满足png图像超出jpg图像范围时,依然可以正常叠加
    '''
    x2 = x1 + target_img.shape[1]
    y2 = y1 + target_img.shape[0]
 
    xx1 = 0
    yy1 = 0
    xx2 = target_img.shape[1]
    yy2 = target_img.shape[0]
 
    if x1 >= bg_img.shape[1]:
        x1 -= bg_img.shape[1]
    if y1 >= bg_img.shape[0]:
        y1 -= bg_img.shape[0]
 
    if x2 >= bg_img.shape[1]:
        xx2 = target_img.shape[1] - (x2 - bg_img.shape[1])
        x2 = bg_img.shape[1]
    if y2 >= bg_img.shape[0]:
        yy2 = target_img.shape[0] - (y2 - bg_img.shape[0])
        y2 = bg_img.shape[0]
 
    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_target = target_img[yy1:yy2, xx1:xx2, 3] / 255.0
    alpha_bg = 1 - alpha_target
 
    # 开始叠加
    for c in range(0, 3):
        bg_img[y1:y2, x1:x2, c] = ((alpha_bg * bg_img[y1:y2, x1:x2, c]) + (alpha_target * target_img[yy1:yy2, xx1:xx2, c]))
 
    return bg_img
 
 
def set_wallpaper(phone_model, content_list, out_file=None):
    """
        phone_model     - 手机型号
        content_list    - 内容
        out_file        - 输出文件
 
    """
    resolution = (0, 0# 分辨率
    if phone_model == 'iphone se2':
        resolution = (750, 1334)
 
    # 设置背景
    if resolution != (0, 0):
        bg_img = Image.new('RGBA', resolution, '#fbedb2')
        # bg_im = cv2.cvtColor(np.asarray(bg_im), cv2.COLOR_RGB2BGR)
    else:
        print("don't have this version" )
        return
 
    # 添加语句
    # font = cv2.FONT_HERSHEY_DUPLEX  # cv2设置字体
    draw_text = ImageDraw.Draw(bg_img)
    # font = ImageFont.truetype('C:\Windows\Fonts\simhei.ttf', 30) # 设置字体,系统内置,也可下载,如自由字体
    font = ImageFont.truetype(r'C:\Users\Administrator\AppData\Local\Microsoft\Windows\Fonts\千图小兔体.ttf', 30)
    i = 0
    for content in content_list:
        # cv2.putText(bg_im, content, (100, 100), font, 5, (254, 67, 101))  # cv2.putText() 只能显示英文字符,中文会出现乱码问题,
        offset = 120 * i
        draw_text.text((100, 120 + offset), content, font=font, fill=(0, 0, 0))
        i += 1
    # 将包含字体的读取为cv2形式,以便添加图片
    bg_img.save('./background.png')
    bg_img = cv2.imread('./background.png', cv2.IMREAD_UNCHANGED)
    os.remove('./background.png')
 
    # 添加图标
    icon_img = cv2.imread('gold.png', cv2.IMREAD_UNCHANGED)
    white2transparent(icon_img)
    for j in range(1, len(content_list)+1):
        offset = 120 * j
        bg_img = merge_img(bg_img, icon_img, 66, offset)
 
    # 添加装饰
    decorate_milktea_img = cv2.imread('milktea.png', cv2.IMREAD_UNCHANGED)
    decorate_fruit_img = cv2.imread('fruit.png', cv2.IMREAD_UNCHANGED)
    decorate_img_list = [decorate_milktea_img, decorate_fruit_img]
    for decorate_img in decorate_img_list:
        white2transparent(decorate_img)
        random_pos_x = random.randint(0,resolution[0]-300)
        random_pos_y = random.randint(740, resolution[1]-200# 范围内的随机数
        bg_img = merge_img(bg_img, decorate_img, random_pos_x, random_pos_y)
 
    # 保存图片
    if out_file:
        cv2.imwrite('./wallpaper.png', bg_img)
 
    cv2.imshow('bgim', bg_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 
 
if __name__ == '__main__':
    content_list = [
        '天天开心',
        '心想事成'
    ]
    set_wallpaper('iphone se2', content_list, './wallpaper.png')
   

效果

用python生成一张壁纸实例代码

总结

到此这篇关于用python生成一张壁纸实例代码的文章就介绍到这了,更多相关python生成壁纸内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42442319/article/details/122828295

延伸 · 阅读

精彩推荐