馬上又要進入一年一度的520了,作為一個地地道道的程式猿心里慌得一批,除了吃飯買禮物看電影好像就沒有更多的想法了,于是想想將女友從以前到現在的所有照片整理了一下準備制作一個前所未有的照片墻,
【閱讀全文】
當然,這里我使用的照片是從百度上面拿下來的,私人照片不能公開,哈哈~

沒有女朋友的也可以試試,畢竟萬一哪天就有了呢!
話不多說,進入正題吧,先將需要的非標準庫梳理一下,只有一個PIL影像處理庫,另外一個是os的標準庫是用來操作檔案的,
from PIL import Image
import os
然后,定義一個二維陣列,這個二維陣列是由0和1組成的,觀察一下0的位置聯合起來就是一個心的形狀,之后我們需要按照這個規則將需要的照片放置上去就形成了一個心形的照片墻,
location = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
需要注意的是0的數量其實就是照片的數量,所以盡可能的0的數量是需要小于等于照片的數量,可以根據自己的實際情況進行微調一下也是OK的,
由于我們自己的照片每張的大小可能都是不統一的,所以必須指定一下每張圖片放入后的大小,
img_w = img_h = 192 # 寬高都設定為192像素
# 計算location二維陣列的行的個數、列的個數
rows = len(location)
columns = len(location[0])
# 使用行、列的個數以及每張圖片的像素計算出目標畫布的大小,
canvas = Image.new("RGB", (img_w*columns, img_h*rows),"white")
我們需要在這個畫布上面擺放我們的照片,
下面將我們需要的素材照片拿過來,設定素材圖片(女友照片)所在的檔案夾,
source_img_dir = r"C:\software\pycharm-workspace\the-public\test008\images"
source_imgs = os.listdir(source_img_dir)
沒有女朋友照片的也不要灰心,可以去百度上面下載哈,可以看看我之前的文章'百度圖片下載2.0'下載很多很多的照片,哈哈哈哈!

接下來就可以來生成我們期待的心形照片墻了,進入收割環節,
# 定義一個下標值,方便從我們的imgs陣列里面取出照片,
index = 0
# 通過遍歷二維陣列中的行、列,從而在相應的位置放上我們的照片,
for row in range(rows):
for column in range(columns):
# 若是當前二維陣列中的元素為1時,表示該位置不在心形需要的位置上故不做處理,
if location[row][column] == 1:
continue
# 若是當前二維陣列中的元素為1時,需要將一張照片放到該位置上
else:
try:
# 獲取一張圖片并打開為Image物件
image = Image.open(os.path.join(source_img_dir, source_imgs[index]))
# 重新設定當前照片的尺寸大小
image = image.resize((img_w, img_h))
# 將照片image物件,放在畫布的特定位置
canvas.paste(image, (img_w * column, img_h * row))
# 遞增圖片串列中的圖片下標
index += 1
except:
continue
展示照片墻
canvas.show()
保存照片墻
canvas.save('心形-照片墻.png')
至此,終于大功告成了,感謝大家一直以前的陪伴與支持,我們會繼續努力做出更多精彩的內容!

【往期精彩】
兩個庫搞定python中參考javascript代碼塊/檔案...
python實作excel資料與mysql資料庫互通有無!
python 實作超快視窗截圖,自動獲取當前活動視窗并展示截圖...
怎么用python做一個解壓縮小工具,以后再也不用下載各種格式的解壓縮軟體了...
python中最簡單的turtle繪圖:奧運五環!
歡迎關注作者公眾號【Python 集中營】,專注于后端編程,每天更新技術干貨,不定時分享各類資料!轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479222.html
標籤:Python
