做者:@明哥編程
公衆號:Python編程時光數組
2020年,這個看起來如此浪漫的年份,你仍是一我的嗎?bash
難不成我還能是一條狗?函數
18年的時候,寫過一篇介紹如何使用 Python 來表白的文章。測試
雖然創意和使用效果都不錯,但有一缺點,這是那個exe文件,女神須要打開電腦,纔有可能參與進來,進而被你成功"調戲」。字體
因爲是很早期的文章了,應該有不少人沒有看過。spa
沒有看過的,你能夠點擊這裏查看:用Python寫一個表白神器讓你脫離單身3d
提醒你一下,後天就是 2月14日了。什麼?仍是一條狗呢?code
行吧,那你遇上了,今天的文章,就是爲你而寫。orm
明哥今天來教你如何使用 Python 來向心中的女神表白。
前段時間,在微博上刷到了一條推薦。內容是這樣的
出於好奇,我點開了,放大再放大,emmm,有點意思吖…
這四個字,對於像我這樣靦腆的DS男來講,還真很差意思說,說出來,萬一被拒絕了咋辦?
使用套路來表白,並觀察對方的反應,你大概能清楚對方是否對你也有好感,先測試下本身有幾成的把握再下手或許更穩妥。
今天就教你們一個這樣的套路:如何使用 Python 來作出來這樣的圖,有點浪漫,又有點極客。能不能拿下你女神,就要靠你(命)了。(๑•́₃ •̀๑)
首先,你得先找到一張你女神的高清圖片(儘可能分辨率高點的吧,效果會好點)。
這裏我以一張高圓圓的圖來作一下演示,原圖是這樣的(分辨率是:2000*1328)。
使用我寫好的腳本運行後,就生成了這樣一張圖,請你點擊,放大再放大。(驚喜?
而後將這張圖片發給你的女神,具體話術你本身想咯。
好吧,相比女神來講,你可能更在乎這是如何實現的(活該你單身)。
其實原理很簡單,代碼也還不到20 行。
首先,來說講原理。
事實上,每一張圖片都是由一個一個的像素點所組成的。而每一個像素點,都有本身的顏色,其顏色能夠用一個數組來表示:(a,b,c),其中每位數的取值範圍都是 0-255。
好比(0,0,0)表明黑色,(255,255,255)表明白色。
當像素點足夠多的時候,這張照片就是咱們所說的高清照片。
而若是當像素點太少,咱們的肉眼就能感知到明顯的鋸齒感。
用 Excel 畫了個圖,每一方格表明一個像素,其中若個人字體的大小設置 5(非字號5,而是每一個字佔用5個像素),效果大概就是以下這樣子。
我只要每一個像素取出一個像素值,並使用這個像素作爲該字的顏色便可,在像素量夠多的狀況下,從遠處看,是能看到咱們原來圖像的輪廓的。
有了思路,就能夠開始咱們的代碼。
首先,使用 pillow.Image讀取圖像,並使用load函數獲取到每個像素值。
img_raw = Image.open(img_path)
img_array = img_raw.load()
複製代碼
而後新建一張畫布,並選好你要使用的字體和字體大小。
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
複製代碼
因爲須要不斷循環 「我喜歡你!」,這五個字符。因此這裏能夠while循環 yield 來實現一個生成器。
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
複製代碼
最後,要給這些字加上相應的顏色,寫入新建立的畫布中。
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
複製代碼
最後將成品保存
img_new.convert('RGB').save("F://gyy_save.jpeg")
複製代碼
完整代碼以下,供你參考
from PIL import Image, ImageDraw, ImageFont
font_size = 7
text = "我喜歡你!"
img_path = "F://gyy.jpeg"
img_raw = Image.open(img_path)
img_array = img_raw.load()
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
ch_gen = character_generator(text)
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
img_new.convert('RGB').save("F://save.jpeg")
複製代碼
最後再多上幾張效果圖吧(對,我是海賊迷)。
本文首發於個人我的【公衆號】:Python編程時光
上傳圖片可能會有壓縮,查看效果請前往:情人節來了,教你個用 Python 表白的技巧