python實現心型照片墻效果
今天分享如何用python制作好看的心型照片墻,供大傢參考,具體內容如下
效果
我們先來看下效果圖,瞭解我們接下來要做的事情,我的效果圖如下:
感覺如何?如果還滿意,看完幸苦點個贊,因為看完你也可以做出來!同時也是對我的一種反饋
思路
上代碼之前,我們先來理清下思路,隻有過程理清楚瞭,才能得到自己的想要的結果
制作這個我覺得最難的地方就在於每個圖片的位置該怎麼計算,才能湊成一個心型。但是沒關系,我們不去計算,畢竟我數學很差,我采用土辦法,直接把它位置寫死,雖然稍微有點麻煩,但是靈活~
大傢都知道excel吧,裡面的表格是由一個個單元格組合而成,那請你也把上面的圖想象成表格,是由很多單元格組成的,單元格的大小就是圖片的尺寸,並且去掉瞭邊框。那麼制作這個心型,隻要在單元格內添加單個圖片,然後湊成心的形狀就完成瞭。這就是整體的思路,接下來用代碼去實現這個思路
準備
我先說下制作過程要使用哪些python庫,工具總要先搞好,不然搞個der~
1、pillow:用來處理圖片的庫,屬於第三方庫,需要額外安裝 pip install pillow
2、os:用來獲取圖片,python自帶,不用額外安裝
3、math:用來計算圖片數量,python自帶,不用額外安裝
有上面三個庫就可以瞭,接下代碼走起
代碼
1、導庫
from PIL import Image import os import math
2、制作形狀
我們通過二維數組確定圖片的位置,每個元素相當於excel中的單元格:1代表空白,0代表圖片。看到由0組成的愛心瞭嘛?這裡純手打(所以你可以自由改動,做出你想的形狀,這就是靈活的地方~)
因為我圖片有500張,所以我想做大一點,放更多的圖片,所以元素的個數會比較多,下面是21×21的大小。
記住:0的個數一定要比你的圖片數量少或剛好相等,否則就不是一個完整的愛心瞭!
map = [ [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], ]
3、導入圖片
位置確定好瞭,開始獲取所有的圖片
# 這個是我圖片的所在路徑 img_dir = r"C:\Users\admin\Desktop\頭像" # 獲取這個文件下的所有文件,因為沒有過濾其他類型文件,所以不要放非圖片文件 # 返回的是一個列表 imgs = os.listdir(img_dir) # 設置圖片的尺寸,所有圖片尺寸要保持統一,要有組織有紀律 img_h = img_w = 192 # 計算行數,即子列表的個數 rows = len(map) # 計算列數,即子列表中元素的個數 columns = len(map[0])
畫圖
接下來就是準備一個白色的背景,當作畫佈。有瞭行數、列數和圖片的寬高,就可以計算出整個畫佈的尺寸瞭
# 第一個參數照著寫 # 第二個參數需要傳入一個元組,元組的第一個參數是畫佈的寬,第二個是高 # 第三個參數傳入的是畫佈的顏色 # 使用Image.new()方法創建一個畫佈 figure = Image.new("RGB", (img_w*columns, img_h*rows),"white")
到目前為止,圖片和畫佈都已經準備好瞭,現在就是將圖片放置在畫佈對應的位置上瞭,即數組中元素為0的位置
# 表示圖片的下標 count = 0 # 遍歷行 for i in range(len(map)): # 遍歷每行中的所有元素 for j in range(len(map[i])): # 如果元素是1,就不管它 if map[i][j] == 1: continue # 如果元素是非1,即0就放圖片上去 else: # 做個異常處理,防止有些圖片打開失敗,導致程序中斷 try: # 使用Image.open("圖片路徑")方法獲取圖片對象 image = Image.open(os.path.join(img_dir, imgs[count])) except: continue # resize((新的寬,新的高))用來改變圖片的尺寸,接收一個元組 image = image.resize((img_w, img_h)) # 將修改尺寸後的圖片(image)粘貼(paste)到畫佈(figure)上 # 第一個參數 是圖片對象 # 第二個參數是 圖片在畫佈上的位置,相當於單元格的位置 figure.paste(image, (img_w*j, img_h*i)) # 使用完一張圖片就要記錄下來,並開始使用下一張圖片 count += 1 # 當循環結束,即表示心型照片圖已經完成 # 將畫好的畫佈顯示出來,給你看到 figure.show() # 不滿意在調整二維數組中0的位置,滿意可以保存到本地,用來裝逼 # 需要告知程序圖片保存的路徑 figure.save('心型照片墻.png')
到此,心型照片墻就制作出來瞭,如果你有女朋友,可以用自己女朋友的照片,背景用紅色,然後發給你女朋友看,會不會更愛你我就不知道瞭,也可以寫個i love you~(圖如下)。可惜我沒有,好氣哦!
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於python使用Pillow做動態圖在圖中生成二維碼以及圖像處理
- python之pil的使用詳解
- python 對圖片進行簡單的處理
- 用python編寫一個圖片拼接工具
- Python 圖像處理 Pillow 庫詳情