前言 大家早好、午好、晚好吖~ 這不光棍節快到了,表弟準備寫一封情書給他的女神,想在光棍節之前脫單。 為了提高成功率,於是跑來找我給他參謀參謀,本來我是不想理他的。 不過誰讓他是我表弟呢(請我洗jio),於是教給他程式員的終極浪漫絕招 先假裝給女神拍照,然後再把情書寫到她的照片上列印出來送給她,嘿嘿 ...
前言
大家早好、午好、晚好吖~
這不光棍節快到了,表弟準備寫一封情書給他的女神,想在光棍節之前脫單。
為了提高成功率,於是跑來找我給他參謀參謀,本來我是不想理他的。
不過誰讓他是我表弟呢(請我洗jio),於是教給他程式員的終極浪漫絕招
先假裝給女神拍照,然後再把情書寫到她的照片上列印出來送給她,嘿嘿~
實現步驟
想要實現把情書寫在像素中,那麼我們就需要用到pillow
這個神器。
眾所周知,圖片是由無數個像素所組成的,把圖片無限放大,就會看到一個個小方格,這就是像素。
1、準備工作
我們都知道,針對圖片進行操作,就會用到Pillow
這個庫
因為Pillow
是第三方庫,所以在使用前,我們要進行安裝。
win + r
輸入cmd
按回車打開命令提示符視窗,使用pip
安裝
pip install Pillow
2、Pillow 介紹
安裝完成後,我們先來簡單介紹幾個常用示例
新建及保存圖片
from PIL import Image #創建一張新的圖片:mode 為RGB,size :520x520 ,color :0,100,200 img = Image.new('RGB',(520,520),(255,192,203)) # 保存圖片 img.save('img.jpg')
運行代碼,可以看到,在預設路徑自動創建一張img.jpg
圖片。
來看看圖片是什麼樣子的
粉粉嫩嫩的,就是它了~
重新繪製圖片
我們在上面生成的圖片中,畫兩條線
from PIL import Image,ImageDraw #創建一張新的圖片 #img = Image.new('RGB',(520,520),(0,100,200)) #img.save('img.jpg') #直接打開生成的img.jpg圖片 img = Image.open('img.jpg') #取得繪圖對象,需要繪製對角線 draw = ImageDraw.Draw(img) #繪製對角線 draw.line((0,0,img.size[0],img.size[1]),fill = 128 ,width = 2) draw.line((0,img.size[1],img.size[0],0),fill = 128 ,width = 2) #保存圖片 img.save('img-line.jpg')
再來看看生成的圖片
莫得問題
圖片合併
然後我們把兩張圖片合併
from PIL import Image #直接打開img.jpg圖片 img = Image.open('img.jpg') #創建一個小的圖片 img_small = Image.new('RGB',(30,30),'yellow') #把img_samll 黏貼在 img.jpg圖片的 的20x20的位置 img.paste(img_small,(20,20)) #保存新生成的圖片 img.save('img-paste.jpg')
看看效果如何
確認過眼神,是我要的效果~
完整代碼、視頻講解直接點擊下方自取即可。
==點擊 藍色字體 自取,我都放在這裡了。==
3、實戰演練
思路大致分三步
1、先創建基本的信息:文案內容,像素尺寸,字體類型,圖片路徑;
2、創建小圖來填充內容,在創建大圖狀態填充好的小圖內容;
3、迴圈遍歷圖片的內個像素點,把文字黏貼上去。
我們來看看巳月的女神照片:
實現代碼
from PIL import Image,ImageDraw,ImageFont #像素放大尺寸 img_king_size = 20 #輸入內容 text = '這是巳月的女神' #設置字體 font = ImageFont.truetype('simsun.ttc',img_king_size) #圖片路徑 img_path = './king.jpg' #打開圖片 img = Image.open(img_path) img_w,img_h = img.size #創建一個小圖,用於填充字體 img_child = Image.new("RGB", (img_king_size, img_king_size)) #創建一個大圖,狀態填充好的小圖字體 img_ans = Image.new("RGB",(img_w * img_king_size,img_h * img_king_size)) #獲取單個文字的寬和高 text_w,text_h = font.getsize('中') #文字水平居中 offset_x = (img_king_size - text_w) >> 1 #文字垂直居中 offset_y = (img_king_size - text_h) >> 1 char_index = 0 #小圖用於繪製文字 draw = ImageDraw.Draw(img_child) #迴圈遍歷原圖的每一個像素點 for x in range(img_w): for y in range(img_h): #繪製背景,讓圖片更好看 draw.rectangle((0,0,img_king_size,img_king_size),fill = 'lightgray') #用(x,y)處的像素點的色值進行繪製字體 draw.text((offset_x,offset_y),text[char_index],font = font,fill = img.getpixel((x,y))) img_ans.paste(img_child,(x * img_king_size,y * img_king_size)) char_index = (char_index + 1) % len(text) img_ans.save('king-letter.jpg')
我們看下效果圖
生成的圖片超過C站上傳最大限制,所以不能上傳原圖,只能截個圖看看效果了:
放大版的,還可以放大,我就不放到最大了。
我這裡顯示的字是豎的,因為我的圖片是長比寬大,改成橫版照片的話,字就是橫的了。
這要是看不清楚的話,大家可以自己去試試,放到最大。