1. 程式人生 > 程式設計 >520使用Python實現“我愛你”表白

520使用Python實現“我愛你”表白

摘要: 每到情人節、七夕節,不少小夥伴大夥伴們都會遇到這樣一個世紀問題——怎麼給女朋友/老婆一個與眾不同的節日驚喜。今天給大家分享一個獨特的表白方法——用“我愛你”拼出心愛人的模樣!

每到情人節、七夕節,不少小夥伴大夥伴們都會遇到這樣一個世紀問題——怎麼給女朋友/老婆一個與眾不同的節日驚喜。

你說送花吧,到時候朋友圈裡一劃,全部都是送花的,女票:“沒創意!”,遂卒;

你說送禮物吧,要是送的禮物不合心意,女票:“你根本不懂我!”,又卒;

你說逛街買買買吧,摸摸空空的口袋,默默把這個想法丟到一邊...

今天,就和大家分享一個獨特的表白方法——用“我愛你”拼出心愛人的模樣!

520使用Python實現“我愛你”表白

成品圖!

520使用Python實現“我愛你”表白

什麼?看不清長啥樣?放大來康康

520使用Python實現“我愛你”表白

想做出這樣的照片嗎?那麼~我們現在就開始啦~

一. 需要準備的有

女票超級無敵可愛美膩的照片 1張!

python (這裡用的是python3.7)

需要的用到的庫

cv2:用來讀取照片

PIL:用來生成新的圖片

效能比較OK的電腦

(如果沒有接觸過python,不想/不會配環境、裝cv2、PIL之類的庫,或者電腦效能不太夠,強烈推薦使用華為雲的ModelArts進行開發~直接解決環境配置、電腦效能的各種問題~)

二. 基本思路
要實現這樣的效果,首先需要有一張照片,提取其畫素資訊,然後賦給排佈滿文字的新圖片,就能得到如上圖所示的一張新圖片啦!

廢話不多說,接下來就開始吧~

三.操作流程

1.首先匯入用到的庫(兩者的作用在1中已有介紹)

from PIL import Image,ImageDraw,ImageFont

2.然後開始宣告繪圖的方法

這裡有兩個引數,分別是原圖片的路徑和要寫的文字

def draw(pic,draw_text):

3.接著讀取圖片

使用cv2中的imread方法讀取圖片資訊,

使用PIL中的Image方法建立一個新的圖片,其尺寸和源圖片一致,背景為白色

blank = Image.new("RGB",[img.shape[1],img.shape[0]],"white")
drawObj = ImageDraw.Draw(blank) # 告訴程式,我們接下來就要在這個圖上寫字啦!

4.宣告繪圖的一些引數(這些引數都是我經過多次試驗得到的最佳大小~)

m = 9 # 字型的大小
font_path = '你使用字型的位置' # 字型的路徑
font = ImageFont.truetype(font_path,size=m) # 將字型資訊賦給font變數,供後續使用

5.接下來就是最關鍵的一步!把文字寫上去,並按照源圖片給圖片上色

通過兩個for迴圈,依次定位到每個文字所在的色塊(中間間隔n是因為文字比畫素塊大得多,不可能完全按照每個畫素的位置和色彩來排布)

使用text()方法填入帶色彩的文字,幾個引數分別代表:

[j,i] -- 座標位置

draw_text[int(j / n) % len(draw_text)] -- 找到當前該寫入哪個文字了(比如“我愛你”中的第幾個字)

fill=(img[i][j][2],img[i][j][1],img[i][j][0]) -- 代表源圖片對應位置的顏色(三個分別代表RBG顏色值)

for i in range(0,img.shape[0],n):
for j in range(0,img.shape[1],n):
drawObj.text(
[j,i],
draw_text[int(j / n) % len(draw_text)],
fill=(img[i][j][2],img[i][j][0]),
font=font
) # 按句子的順序填充文字

6.寫入完成,匯出圖片

7.呼叫我們封裝好的方法~

輸入圖片路徑和目標文字,執行~一張獨一無二的表白圖就大功告成!

draw('1.jpg',"我愛你")

附上全程式碼(記得把字型路徑改成自己電腦的喲~)

from PIL
import Image,ImageFont
def draw(pic,draw_text):
	img = cv2.imread(pic)
blank = Image.new("RGB",img.shape[0]
],"white")
drawObj = ImageDraw.Draw(blank)
n = 10
m = 9
font = ImageFont.truetype(font_path,size = m)
for i in range(0,n):
	for j in range(0,n):
	drawObj.text(
		[j,draw_text[int(j / n) % len(draw_text)],fill = (img[i][j][2],font = font
	)
blank.save('img_' + pic)
draw('1.jpg',"我愛你")

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。