用python生成一张壁纸实例代码
作者:橙橙小狸猫 发布时间:2022-06-06 10:26:51
标签:python,壁纸
前言
之前在csdn上看见用python写春联的,这次突发奇想用python制作一张壁纸,其元素包括背景、文字、图片。
知识点 用PIL创建一张纯色背景Image.new;图片上添加文字ImageDraw,cv2只能显示英文;转换图片的透明度;图片上叠加图片;jpg与png的区别。
代码
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')
效果
来源:https://blog.csdn.net/weixin_42442319/article/details/122828295


猜你喜欢
- 这是写给web设计者和前端开发者的教程,我们将演示如何使用Photoshop创建按钮的sprite图,然后是如何使用jQurey打造动态渐变
- 今天来介绍一下Tensorflow里面的反卷积操作,网上反卷积的用法的介绍比较少,希望这篇教程可以帮助到各位反卷积出自这篇论文:Deconv
- 前言:一般处理数据使用的是pandas和numpy库,但是填充单元格颜色需要在excel中,使用的是openpyxl库,所以不能直接达到我们
- 插件下载:blueideasearch.xpi首先第一步 说一下怎么样查看firefox插件的源码, 就我上边写的那个东西,把它下载下来.将
- 学习了一天的深度学习,略有疲惫,我们用pygame搞个小游戏放松放松吧。今天我们的游戏主体是烟雨蒙蒙下彩虹雨,仿佛置身江南水乡。游戏描述我们
- MAC上的PyCharm中默认的python解释器是python2的,windows下的没用过不是很清楚,所以特来记录下设置python3解
- 用Python发送126邮件,供大家参考,具体内容如下今天想做个自动化邮件提醒的功能,最近刚好在学习python,都说python那么强大,
- 1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节; 2.数据项:是否有大字段,那些字段的值是否经常被更新; 3.数据查询SQ
- 一、vscode插件介绍在我们演示插值表达式之前,我们先安装这一个VScode给我们提供的插件,它可以将我们书写好的网页通过服务端口的方式进
- 一、使用步骤 1.引入库(安装Python环境、PyQt、PyQt-tools)from PyQt5 import QtCore,
- 1. 横排往下会影响阅读速度。如12345678的单排单列数字,肯定是竖排阅读快。但多行多列的整块信息,横排并不见得就比竖排慢,比如所有简体
- 0. 学习目标单链表只有一个指向直接后继的指针来表示结点间的逻辑关系,因此可以方便的从任一结点开始查找其后继结点,但要找前驱结点则比较困难,
- tzset()方法重置所使用的库例程的时间转换规则。环境变量TZ指定如何完成此操作。TZ环境变量的标准格式(空格为清楚起见而加的
- 本文实例为大家分享了python os模块在系统管理中的应用代码,供大家参考,具体内容如下#临时文件import tempfile temp
- 第一步,建立一个CPP的DLL工程,然后写如下代码,生成DLL#include <stdio.h> &nb
- 在VBScript中,有一个On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行。接着该脚本可以检
- 前言最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件。文档之前是由base64编码,导致所有汉字读取显示乱码。项目组把b
- 一般来说,我们为了得到更完整的结果,我们需要从两个或更多的表中获取结果,我一般都是用select xxx,xxx from 表1,表2 wh
- 1.超链接<a href="https://www.aspxhome.com" title="asp之家
- 1. 前言中文分词≠自然语言处理!HanlpHanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。H