用Python做一個520表白神器,值得收藏

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

先來看一下具體的效果。

運行程序。

用Python做一個520表白神器,值得收藏

點擊「選擇圖片」 選擇JPG/JPGE/PNG三種中任意一種格式的圖片,然後點擊生成表白圖片則可。這裡還要注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新python教程項目,還可以跟老司機交流討教!

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

用Python做一個520表白神器,值得收藏

將圖片放大看看,會發現圖片全部由「我喜歡你!」構成。

編碼時刻

我們知道圖片由不同的像素組成,每個像素都有自己的顏色,通過RGB來表示,如圖。

用Python做一個520表白神器,值得收藏

(圖出自 easyai)

RGB本身就是一個數組:(a,b,c),數組中的每一位的取值範圍都是0~255,比如黑色可以通過(0,0,0)來表示。

用Python做一個520表白神器,值得收藏

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

有了具體的思路,就可以編寫代碼了。完整代碼在文末,這裡先看關鍵代碼片段理解思路。

在Python中可以通過PIL來實現對圖片的各種操作。

首先安裝一下PIL。

<code>pip install pillow
複製代碼/<code>

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

首先,通過PIL.Image打開圖片並通過load方法加載圖片數組

<code># 打開圖片
img_raw = Image.open(img_path)
# 加載圖片的像素數組
img_array = img_raw.load()
複製代碼/<code>

然後創建一張新的畫布並設置好要使用的字體和字體大小,用來繪製待生成的圖像。

<code>img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('SimHei.ttf', font_size)
複製代碼/<code>

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

<code>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)
複製代碼/<code>

至此大功告成。

用Python做一個520表白神器,值得收藏

是否可以再優化一下?

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

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

這裡同樣給出部分代碼,完整代碼看文末。

首先創建一個界面。

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

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

<code># 選擇圖片
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()
複製代碼/<code>

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

<code>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='目前沒有選擇任何圖片文件')
複製代碼/<code>

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

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

最後

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

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

用Python做一個520表白神器,值得收藏


用Python做一個520表白神器,值得收藏

都懂了嗎?最後注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新python教程項目,還可以跟老司機交流討教!

用Python做一個520表白神器,值得收藏

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。


分享到:


相關文章: