用python生成一張壁紙實(shí)例代碼
前言
之前在csdn上看見用python寫春聯(lián)的,這次突發(fā)奇想用python制作一張壁紙,其元素包括背景、文字、圖片。
知識點(diǎn) 用PIL創(chuàng)建一張純色背景Image.new;圖片上添加文字ImageDraw,cv2只能顯示英文;轉(zhuǎn)換圖片的透明度;圖片上疊加圖片;jpg與png的區(qū)別。
代碼
import os
from PIL import ImageFont, ImageDraw, Image
import cv2
import random
def white2transparent(img):
"""
將白色部分設(shè)置為透明
:param img: 需要修改的圖片
:return: 修改后的圖片
"""
# Image讀取形式----------------------------------------------
# img = img.convert('RGBA')
# img = img.convert("RGBA") # 轉(zhuǎn)換格式,確保像素包含alpha通道
# 加一個判斷,不是四通道就推出
# width, height = img.size # 長度和寬度
# for i in range(0, width): # 遍歷所有長度的點(diǎn)
# for j in range(0, height): # 遍歷所有寬度的點(diǎn)
# 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): # 遍歷所有長度的點(diǎn)
for j in range(0, height): # 遍歷所有寬度的點(diǎn)
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: 目標(biāo)圖片,要求四通道
:param x1: target_img在bg_img的坐標(biāo),如果需要調(diào)節(jié)圖片大小,請?jiān)诤瘮?shù)外resize
:param y1:
:return:
"""
# 判斷jpg圖像是否已經(jīng)為4通道
if bg_img.shape[2] == 3 or target_img.shape[2] == 3:
print("merge image error, image must 4 channels.")
return
'''
當(dāng)疊加圖像時,可能因?yàn)榀B加位置設(shè)置不當(dāng),導(dǎo)致png圖像的邊界超過背景jpg圖像,而程序報(bào)錯
這里設(shè)定一系列疊加位置的限制,可以滿足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 - 手機(jī)型號
content_list - 內(nèi)容
out_file - 輸出文件
"""
resolution = (0, 0) # 分辨率
if phone_model == 'iphone se2':
resolution = (750, 1334)
# 設(shè)置背景
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設(shè)置字體
draw_text = ImageDraw.Draw(bg_img)
# font = ImageFont.truetype('C:\Windows\Fonts\simhei.ttf', 30) # 設(shè)置字體,系統(tǒng)內(nèi)置,也可下載,如自由字體
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() 只能顯示英文字符,中文會出現(xiàn)亂碼問題,
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')
# 添加圖標(biāo)
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) # 范圍內(nèi)的隨機(jī)數(shù)
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')
效果

總結(jié)
到此這篇關(guān)于用python生成一張壁紙實(shí)例代碼的文章就介紹到這了,更多相關(guān)python生成壁紙內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python操作lxml庫實(shí)戰(zhàn)之Xpath篇
XPath是一門在XML文檔中查找信息的語言,下面這篇文章主要給大家介紹了關(guān)于Python操作lxml庫實(shí)戰(zhàn)之Xpath篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Python爬取英雄聯(lián)盟MSI直播間彈幕并生成詞云圖
很開心RNG最近在英雄聯(lián)盟季中賽奪冠了,特地爬取了直播間彈幕并生成詞云圖,大家一起開心一下,看看奪冠時大家都在說什么,需要的朋友可以參考下2021-06-06
Pandas分組聚合之groupby()、agg()方法的使用教程
今天看到pandas的聚合函數(shù)agg,比較陌生,平時的工作中處理數(shù)據(jù)的時候使用的也比較少,為了加深印象,總結(jié)一下使用的方法,下面這篇文章主要給大家介紹了關(guān)于Pandas分組聚合之groupby()、agg()方法的使用教程,需要的朋友可以參考下2023-01-01
Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn)
這篇文章主要介紹了Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Python抓取聚劃算商品分析頁面獲取商品信息并以XML格式保存到本地
這篇文章主要為大家詳細(xì)介紹了Python抓取聚劃算商品分析頁面獲取商品信息,并以XML格式保存到本地的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Python按天實(shí)現(xiàn)生成時間范圍序列的方法詳解
有的時候我們希望生成一段時間返回,比如從?2022-01-01?00:00:00?后面的?10?天,這么?10?個?datetime?對象,但是我們又不想自己去計(jì)算哪些月有30天哪些月有31天。所以本文將用Python實(shí)現(xiàn)按天自動生成時間范圍序列,需要的可以參考一下2022-11-11

