用Python作一個情人節表白神器

思路來自於「Python 編程時光」,我在其之上改進了一下,主要是經過tkinter編寫一個界面方便使用,你們能夠關注「Python 編程時光」這一良心公衆號。python

本文最後給出了打包好的軟件,無需安裝Python環境和各類依賴,直接下載軟件,解壓後,雙擊exe文件便可使用。git

先來看一下具體的效果。github

運行程序。編程

點擊「選擇圖片」 選擇JPG/JPGE/PNG三種中任意一種格式的圖片,而後點擊生成表白圖片則可。windows

好比我選擇了一張「進擊的巨人」圖片,其生成效果以下。數組

將圖片放大看看,會發現圖片所有由「我喜歡你!」構成。框架

編碼時刻

咱們知道圖片由不一樣的像素組成,每一個像素都有本身的顏色,經過RGB來表示,如圖。字體

(圖出自 easyai)

RGB自己就是一個數組:(a,b,c),數組中的每一位的取值範圍都是0~255,好比黑色能夠經過(0,0,0)來表示。優化

我只須要將圖片中每一個像素的RGB值都取出,並使用這個RGB值做爲字體的顏色則可,這樣生成的圖片從遠處來看依舊會是本來圖像的輪廓。編碼

有了具體的思路,就能夠編寫代碼了。完整代碼在文末,這裏先看關鍵代碼片斷理解思路。

在Python中能夠經過PIL來實現對圖片的各類操做。

首先安裝一下PIL。

pip install pillow
複製代碼

PIL消極維護,一羣愛好者fork了PIL的代碼,並在其之上進行維護與修改,fork後的代碼項目稱爲pillow。

首先,經過PIL.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('SimHei.ttf', font_size)
複製代碼

最後就是循環img_raw並將圖像像素數組對應的值賦值給字體,做爲字體的顏色。

for y in range(0, img_raw.size[1], font_size):
    for x in range(0, img_raw.size[0], font_size):
        # 繪製文字並賦值顏色,具體爲fill參數
        draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
複製代碼

至此大功告成。

是否能夠再優化一下?

爲了讓沒有編程經驗的朋友能夠輕鬆使用,我決定用tkinter作一個簡陋的界面,再使用pyinstaller進行打包,讓各位無需安裝Python環境與PIL,直接開箱即用。

tkinter是Python內置的桌面應用框架,相比於PyQT5,它更加輕便,但功能也更加簡陋,但用於開發表白神器已經足夠了,tkinter內置於Python,不行安裝,直接使用。

這裏一樣給出部分代碼,完整代碼看文末。

首先建立一個界面。

self.window = window
self.window.title('表白神器')
self.window.geometry('300x200')
menubar = Menu(self.window)
複製代碼

而後定義兩個按鈕與對應的響應方法。

# 選擇圖片
btn1 = Button(window, text='選擇圖片', width=15, height=2, command=self.get_img)
btn1.pack()

# 生成圖片
self.send_btn = Button(window, text='生成表白圖片', width=15, height=2, command=self.gen_img)
self.send_btn.pack()
複製代碼

當點擊選擇圖片按鈕時,get_img方法會被調用,具體代碼以下。

def get_img(self):
   global IMGPATH
   # 選擇文件
   filenames = askopenfilenames(filetypes=(("jpeg img", "*.jpeg"), ("jpg img", "*.jpg"), ("png img", "*.png")))
   if len(filenames) > 0:
       fnlist = [fn for fn in filenames]
       fnstr = '\n'.join(fnlist)
       self.l.config(text=fnstr) # 顯示選擇了什麼文件
       IMGPATH = fnlist
   else:
       self.l.config(text='目前沒有選擇任何圖片文件')
複製代碼

上述代碼中,get_img方法經過tkinter的askopenfilenames方法打開系統的文件選擇框,經過filetypes參數指定能夠選擇的文件類型,最終該方法會返回該文件完整的文件路徑。

點擊生成圖片時,會調用gen_img方法,該方法就是調用前面編寫好生成圖像的方法,再也不贅述。

最後

爲了方便他人使用,我經過pyinstaller將表白程序打包。windows下的朋友能夠直接下載,而後解壓使用,找到壓縮文件中的loveyou.exe,雙擊運行則可以使用。

注意:表白圖片會生成在loveyou.exe的相同目錄下。

連接:pan.baidu.com/s/1y0633mzo… 關注「懶編程」回覆「表白」獲取提取碼

程序的完整代碼也開源放在了github,連接爲:github.com/ayuLiao/ILo…

若是文章對你有幫助,點個「在看」吧,讓更多人知道我。

相關文章
相關標籤/搜索