用Python打造你的專屬情人節賀卡,趕快發給TA浪漫一下吧

天元浪子發表於2020-02-17

明天就是情人節了。這個情人節,註定是一個不能約會的情人節,但不能約會不代表不能浪漫。古人比我們出生早,那些浪漫的詩詞早都被他們挖掘一空,比詩詞我們肯定沒有機會了。好在我們還有Python,不然都不知道該如何表達浪漫。接下來,浪導教你製作一個浪漫的情人節專屬賀卡。

首先,準備一張你們的合影和一段深情的表白。浪導已經過了戀愛的年齡,照片和情話只好借用https://baijiahao.baidu.com/s?id=1658389297213946646&wfr=spider&for=pc裡面的內容。 侵刪。

原圖及製作完成後的賀卡放在一起,效果如下圖:
在這裡插入圖片描述

1. 處理照片

我選擇了這張圖片:
在這裡插入圖片描述
將人形的部分處理成純白色:

>>> import cv2
>>> import numpy as np
>>> from PIL import Image
>>> img = cv2.imread('d:\\photo.jpg')
>>> mask = np.zeros(img.shape[:2], np.uint8)
>>> size = (1, 65)
>>> bgd = np.zeros(size, np.float64)
>>> fgd = np.zeros(size, np.float64)
>>> rect = (1, 1, img.shape[1], img.shape[0])
>>> cv2.grabCut(img, mask, rect, bgd, fgd, 10, cv2.GC_INIT_WITH_RECT)
>>> mask2 = np.where((mask == 2) | (mask == 0), 1, 255)
>>> img = img.astype(np.int32)
>>> img *= mask2[:, :, np.newaxis]
>>> img[img>255] = 255
>>> img =img.astype(np.uint8)
>>> img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
>>> img = Image.fromarray(img, 'RGB')
>>> img.save('d:\\mask.jpg')

最後的結果:
在這裡插入圖片描述
稍微有點瑕疵,不要緊,這不影響後面的效果。

2. 生成詞雲

用wordcloud庫,可以很輕鬆的生成詞雲,首先,安裝wordcloud:

pip install wordcloud

安裝完成,就可以生成詞雲了:

>>> from wordcloud import WordCloud
>>> fp = open(r"d:\情話.txt", "r")
>>> text = fp.read()
>>> text
'春風十里,不及相遇有你;晴空萬里,不及心中有你。\n世人萬千種,浮雲莫去求;斯人若彩虹,遇上方知有。\n沒有電影電視劇的浪漫,不敢許你三生三世,只願給你兩廳三室。\n你可以把餘生交給我保管,可以霸佔我情話裡的每一句喜歡。\n青山不及你眉長,水清不似你目澈,跨過山水幾場雨,我一生只要一個你。\n我並沒有喜歡哪一種型別的人,如果我喜歡你,我喜歡的就只是你。\n春花,秋月,夏日清風,冬日暮雪,這些都很美,但唯有你的心裡,才是我想去的四季。\n世上最牢固的感情不是“我愛你”,而是“我習慣了有你”。彼此依賴,才是最深的相愛。\n你在身邊的時候,你就是整個世界;你不在身邊的時候,整個世界都是你。\n這世界上你或許不是最優秀的人,但我愛上你的時候,你就是我的全世界!\n遇見你是無意,認識你是天意,想著你是情意,不見你時三心二意,見到你便一心一意。\n我看那晚霞是紅的,因為它懷裡摟著個太陽。我想我的臉也該是紅的吧,因為我心裡住著你。'
>>> wordcloud=WordCloud(font_path="C:/Windows/Fonts/simfang.ttf", background_color="black",width=600,height=300,max_words=50).generate(text)
>>> image=wordcloud.to_image()
>>> image.save("d:\\wordcloud1.png")

結果如下:
在這裡插入圖片描述
wordcloud支援掩碼,可以利用前面處理好的圖片,生成指定形狀的詞雲:

>>> import numpy as np
>>> from PIL import Image
>>> mask_pic=numpy.array(Image.open(r"d:\mask.jpg"))
>>> wordcloud = WordCloud(font_path=r"C:\Windows\Fonts\simfang.ttf",mask=mask_pic).generate(text)
>>> image=wordcloud.to_image()
>>> image.save("d:\\wordcloud2.png")

結果為:
在這裡插入圖片描述

3. 生成賀卡

wordcloud不支援生成透明圖片,我們需要自己把圖片處理成透明:

>>> cloud_data = np.array(image)
>>> alpha = np.copy(could_data[:,:,0])      # 生成透明通道
>>> alpha[alpha>0] = 255                    # 不是黑的地方設定為255
>>> new_image = Image.fromarray(np.dstack((cloud_data, alpha)))

最後使用PIL將兩個圖層進行合併:

>>> card = Image.open("d:\\photo.jpg")
>>> card = card.convert("RGBA")
>>> card.paste(new_cloud, (0,0), mask=new_cloud)
>>> card.save("d:\\card.png")

趕快發給女朋友浪漫一下吧:
在這裡插入圖片描述

相關文章