導語:
元旦過完了~接下來就是除夕、春節啦!小編也沒什么拿得出手的禮物送就準備用Python打包🎁一些新年祝福、春節壁紙跟頭像送給大家好了~希望你們喜歡💖
想領取完整原始碼跟更多Python學習資料點擊這行字體
新年祝福語
?1)歲末將至,敬頌冬綏,2022萬事勝意
?2)新的一年過去的就翻篇,好好愛自己,別否定自己,你特別好,特別溫柔,特別值得,
?3)善良,勇敢,優秀,絕不妥協,祝你,也祝我,
?4)陽光暖照,風景美妙,愿輕松和你緊相抱;縱情歡笑,煩惱丟掉,愿快樂在你身邊繞;睡個懶覺,疲倦甩掉,愿悠閑與你共奔跑,跨年夜到,愿你任逍遙~
?5)希望今年你的勇氣多一些,有人能珍惜你心里的柔軟;希望你永遠相信彼方尚有榮光在
新年頭像
教大家,如何使用Python生成emoji風格的頭像,
效果大致如下圖,由很多的emoji圖片方塊組成一張新的頭像圖片

細節圖~

主要是通過matplotlib、pillow和numpy這三個庫來實作的,
import matplotlib.pyplot as plt
from scipy import spatial
from PIL import Image
import numpy as np
對于numpy和matplotlib(以及幾乎所有的影像處理庫)而言,影像基本上只是一個矩陣(例如A),其中每個像素(p)都是A的元素,
如果是灰度影像,則每個像素(p)只是一個數字(或標量),如果為浮點數,則為[0, 1],如果為整數,則為[0, 255],
如果不是灰度級(例如在這次的情況下),則每個像素都是尺寸為3-紅色(R),綠色(G)和藍色(B)或尺寸為4-RGBA的矢量(A代表Alpha,表示的是透明度),
首先讀取影像,并且將影像尺寸縮小,
# 讀取圖片,并且修改圖片大小
G_sm = np.array(Image.open('fans.png').resize([50, 50]).getdata()).reshape([50, 50, 3])/256
# 顯示圖片
plt.figure()
plt.imshow(G_sm)
plt.title('Original Image')
plt.show()
然后讀取emoji影像資料,一共是有近1600個emoji影像資料,
# 讀取emoji資料
emoji_array = np.load("emojis_16.npy")
# 獲取emoji的平均顏色值
emoji_mean_array = np.array([ar.mean(axis=(0,1)) for ar in emoji_array])
# 將得到的每個emoji平均顏色值存盤在樹中以加快搜索速度
tree = spatial.KDTree(emoji_mean_array)
整個影像的平均顏色計算公式如下,

np.load,讀取磁盤陣列資料的函式,通常陣列是以未壓縮的原始二進制格式保存在擴展名為.npy的檔案中,
indices = []
# 平整陣列,一維
flattened_img = G_sm.reshape(-1, G_sm.shape[-1])
print(flattened_img.shape)
# 匹配最相似的表情符號的像素
for pixel in flattened_img:
pixel_ = np.concatenate((pixel, [1]))
# 查詢最近的索引
_, index = tree.query(pixel_)
indices.append(index)
將原圖上每個像素點的顏色均值和emoji的顏色均值配對上,
# 從索引中獲取對應的表情符號
emoji_matches = emoji_array[indices]
# 獲取圖片的高度
dim = G_sm.shape[0]
print(dim)
# 設定最終生成影像的大小,每個表情符號的形狀都是(16,16,4),R, G, B, alpha
resized_ar = emoji_matches.reshape((dim, dim, 16, 16,4))
設定生成影像的大小,每個emoji圖片的大小設定成16*16,
# 轉換單個表情符號補丁(5維)
# 使用numpy塊生成完整的影像(三維)
final_img = np.block([[[x] for x in row] for row in resized_ar]
生成最終結果影像,并且保存,
# 設定畫布
plt.figure()
# 去除坐標軸
plt.axis('off')
# 顯示圖片
plt.imshow(final_img)
# 保存emoji馬賽克風格影像,去除白邊
plt.savefig('image_emoji.png', bbox_inches="tight", pad_inches=0.0)
plt.show()
通過設定plt.savefig的引數,去除影像白邊,保存圖片,
下面就使用小F的微信頭像為例,來實驗一波~

生成的emoji圖看起來不是很細膩,可以設定一下圖片引數為100,
G_sm = np.array(Image.open('weixin.png').resize([100, 100]).getdata()).reshape([100, 100, 3])/256
得到結果如下,

看起來還不錯,鐵汁們也可以使用自己喜歡的頭像去生成啦~
新年壁紙
首先我們需要選擇一個現成的手機壁紙作為模板,我選擇了這種以自己姓氏為主題的專屬手機

這其實是個之前迎接跨年的手機壁紙,先利用ps將圖片中的2020和其他文字去除,

嘗試給圖片添加文字,這里用到的是 PIL(Python Image Library),它是python的第三方影像處理庫,
Image類是PIL中的核心類,有很多種方式來對它進行初始化,比如從檔案中加載一張影像,處理其他形式的影像,或者是從頭創造一張影像等,
下面是本文涉及的一些PIL Image類中常用的方法:
-
save(filename,format) (保存指定格式的影像)
-
open(filename,mode) (打開一張影像),
-
paste(region,box,mask) (將一個影像粘貼到另一個影像)
先拿最簡單的字體(黑體)嘗試吧,
from PIL import Image,ImageDraw,ImageFont
a = '小王小王'
font = ImageFont.truetype('simhei.ttf', 100) # 定義文本,黑體
img = Image.open('底圖.png')
draw = ImageDraw.Draw(img) # 新建畫布繪畫物件
draw.text((200,700),a,(0,0,0),font=font)
#在新建的物件上坐標(200,700)處開始畫出黑色文本
img.show()
img.save('壁紙.png')
運行:

可以可以,第一步是這個意思,不過就是有點丑,
下面開始嘗試將文字傾斜,
結果沒有找到比較好的方法,搜索得到的結論是文字傾斜,不如將圖片傾斜,
于是我打算利用rotate旋轉代碼來旋轉圖片,以達到傾斜的效果,
from PIL import Image,ImageDraw,ImageFont
a = '小王小王'
font = ImageFont.truetype('simhei.ttf', 100) # 定義文本
img = Image.open('底圖.png')
img=img.rotate(-15) #旋轉代碼
draw = ImageDraw.Draw(img) # 新建畫布繪畫物件
draw.text((200,700),a,(0,0,0),font=font)
#在新建的物件上坐標(200,700)處開始畫出黑色文本
img.show()
img.save('壁紙.png')
運行:

額,是傾斜了
不過不是這個效果
是那種很漂亮的,傾斜字體
冥思苦想,
想到將文字寫在一個透明的圖片上,然后旋轉這個圖片后,將圖片覆寫到有底色的底圖上,
不知道大家看懂了嗎,直接嘗試一下吧,
其中img1是透明底的圖片,img2是有底色的底圖
from PIL import Image,ImageDraw,ImageFont
a = '小王小王' # 定義文本
b = '可愛大王'
font = ImageFont.truetype('hylx.ttf', 180)
img1 = Image.open('透明.png')
img1=img1.convert('RGBA')
draw = ImageDraw.Draw(img1) # 新建畫布繪畫物件
draw.text((250,550), a,(255,243,211),font=font)
draw.text((350,800), b,(255,243,211),font=font)
img1=img1.rotate(15) #旋轉代碼
img2 = Image.open('底圖.png')
img2=img2.convert('RGBA')
img2.paste(img1,(0,0),img1) # 將img1粘貼到img2上
img2.show()
img2.save('壁紙.png')
運行:

對對對,就是這種半人半魚的效果,
在手機上簡單測驗一下效果吧

看起來很喜慶嘛!
大家喜歡的話也可以嘗試一下,更換字體和模板底圖,總有一款適合自己~
end
這期到這就分享結束了~喜歡的鐵汁萌記得三連哦~在這里也提前祝大家新年快樂,萬事勝意!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/404226.html
標籤:其他
