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

作者:橙橙小狸猫 时间:2022-06-06 10:26:51 

前言

之前在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')

效果

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

来源:https://blog.csdn.net/weixin_42442319/article/details/122828295

标签:python,壁纸
0
投稿

猜你喜欢

  • 如何做迅雷电影提示效果

    2011-03-31 17:15:00
  • 一个简单的鼠标划过切换效果js源码

    2010-06-21 10:55:00
  • 基于python3 OpenCV3实现静态图片人脸识别

    2022-10-04 20:59:30
  • Python3远程监控程序的实现方法

    2021-07-15 15:03:50
  • pandas数值排序的实现实例

    2022-05-13 01:36:48
  • 深入理解Python中装饰器的用法

    2022-04-25 18:59:31
  • 通过Py2exe将自己的python程序打包成.exe/.app的方法

    2021-07-05 11:05:55
  • python argparse模块传参用法实例

    2022-01-19 09:53:42
  • Python中顺序表的实现简单代码分享

    2022-08-31 22:26:36
  • Python实现位图分割的效果

    2021-09-05 11:13:15
  • 利用Python自动化操作AutoCAD的实现

    2022-02-14 21:32:28
  • ansible-playbook实现自动部署KVM及安装python3的详细教程

    2021-09-02 23:13:12
  • js将table的每个td的内容自动赋值给其title属性的方法

    2023-08-07 18:34:54
  • python题解LeetCode303区域和检索示例详解

    2022-12-13 16:10:11
  • 用Python将动态GIF图片倒放播放的方法

    2023-02-17 07:39:51
  • JavaScript中创建原子的方法总结

    2023-06-29 12:22:14
  • 对pandas replace函数的使用方法小结

    2022-07-04 15:20:24
  • Mootools 1.2教程(20)——选项卡效果(Tabs)

    2008-12-26 18:19:00
  • Python 窗体(tkinter)下拉列表框(Combobox)实例

    2022-04-01 02:38:07
  • ASP 获取文件扩展名函数getFileExt()

    2011-03-11 11:18:00
  • asp之家 网络编程 m.aspxhome.com