趕在520之前,程序員如何用Python送上最特別的“我愛你”表白


摘要:每到情人節、七夕節,不少小伙伴大伙伴們都會遇到這樣一個世紀問題——怎么給女朋友/老婆一個與眾不同的節日驚喜。今天給大家分享一個獨特的表白方法——用“我愛你”拼出心愛人的模樣!
 
每到情人節、七夕節,不少小伙伴大伙伴們都會遇到這樣一個世紀問題——怎么給女朋友/老婆一個與眾不同的節日驚喜。
 
你說送花吧,到時候朋友圈里一划,全部都是送花的,女票:“沒創意!”,遂卒;
 
你說送禮物吧,要是送的禮物不合心意,女票:“你根本不懂我!”,又卒;
 
你說逛街買買買吧,摸摸空空的口袋,默默把這個想法丟到一邊...
 
今天,就和大家分享一個獨特的表白方法——用“我愛你”拼出心愛人的模樣!
成品圖!
 
什么?看不清長啥樣?放大來康康
(滿眼都是愛你的形狀~)
 
想做出這樣的照片嗎?那么~我們現在就開始啦~
 

1. 需要准備的有

女票超級無敵可愛美膩的照片 1張!
python (這里用的是python3.7)
需要的用到的庫
cv2:用來讀取照片
PIL:用來生成新的圖片
性能比較OK的電腦
(如果沒有接觸過python,不想/不會配環境、裝cv2、PIL之類的庫,或者電腦性能不太夠,強烈推薦使用華為雲的ModelArts進行開發~直接解決環境配置、電腦性能的各種問題~)

2. 基本思路

要實現這樣的效果,首先需要有一張照片,提取其像素信息,然后賦給排布滿文字的新圖片,就能得到如上圖所示的一張新圖片啦!
廢話不多說,接下來就開始吧~

3.操作流程

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

import cv2
from PIL import Image, ImageDraw, ImageFont

2.然后開始聲明繪圖的方法

這里有兩個參數,分別是原圖片的路徑和要寫的文字
def draw(pic, draw_text):

3.接着讀取圖片

使用cv2中的imread方法讀取圖片信息,
使用PIL中的Image方法創建一個新的圖片,其尺寸和源圖片一致,背景為白色
img = cv2.imread(pic)
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
drawObj = ImageDraw.Draw(blank) # 告訴程序,我們接下來就要在這個圖上寫字啦!

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

n = 10 # 讀取像素的間隔
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顏色值)
font -- 顯然就是字體信息啦~
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][1], img[i][j][0]),
font=font
) # 按句子的順序填充文字

6.寫入完成,導出圖片

blank.save('img_' + pic) # 保存生成的圖片

7.調用我們封裝好的方法~

輸入圖片路徑和目標文字,運行~一張獨一無二的表白圖就大功告成!
draw('1.jpg', "我愛你")
附上全代碼(記得把字體路徑改成自己電腦的喲~)
import cv2
from PIL import Image, ImageDraw, ImageFont
 
def draw(pic, draw_text):
img = cv2.imread(pic)
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
drawObj = ImageDraw.Draw(blank)
 
n = 10
m = 9
 
font = ImageFont.truetype(font_path, size=m)
 
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][1], img[i][j][0]),
font=font
)
 
blank.save('img_' + pic)
 
draw('1.jpg', "我愛你")

進階~

既然都能做成一幀一幀的圖片了,為什么不把他們連接起來~做成一個表白視頻呢?
 
當然闊以!
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM