python實(shí)現(xiàn)心型照片墻效果
今天分享如何用python制作好看的心型照片墻,供大家參考,具體內(nèi)容如下
效果
我們先來(lái)看下效果圖,了解我們接下來(lái)要做的事情,我的效果圖如下:

感覺(jué)如何?如果還滿意,看完幸苦點(diǎn)個(gè)贊,因?yàn)榭赐昴阋部梢宰龀鰜?lái)!同時(shí)也是對(duì)我的一種反饋
思路
上代碼之前,我們先來(lái)理清下思路,只有過(guò)程理清楚了,才能得到自己的想要的結(jié)果
制作這個(gè)我覺(jué)得最難的地方就在于每個(gè)圖片的位置該怎么計(jì)算,才能湊成一個(gè)心型。但是沒(méi)關(guān)系,我們不去計(jì)算,畢竟我數(shù)學(xué)很差,我采用土辦法,直接把它位置寫(xiě)死,雖然稍微有點(diǎn)麻煩,但是靈活~
大家都知道excel吧,里面的表格是由一個(gè)個(gè)單元格組合而成,那請(qǐng)你也把上面的圖想象成表格,是由很多單元格組成的,單元格的大小就是圖片的尺寸,并且去掉了邊框。那么制作這個(gè)心型,只要在單元格內(nèi)添加單個(gè)圖片,然后湊成心的形狀就完成了。這就是整體的思路,接下來(lái)用代碼去實(shí)現(xiàn)這個(gè)思路
準(zhǔn)備
我先說(shuō)下制作過(guò)程要使用哪些python庫(kù),工具總要先搞好,不然搞個(gè)der~
1、pillow:用來(lái)處理圖片的庫(kù),屬于第三方庫(kù),需要額外安裝 pip install pillow
2、os:用來(lái)獲取圖片,python自帶,不用額外安裝
3、math:用來(lái)計(jì)算圖片數(shù)量,python自帶,不用額外安裝
有上面三個(gè)庫(kù)就可以了,接下代碼走起
代碼
1、導(dǎo)庫(kù)
from PIL import Image import os import math
2、制作形狀
我們通過(guò)二維數(shù)組確定圖片的位置,每個(gè)元素相當(dāng)于excel中的單元格:1代表空白,0代表圖片??吹接?組成的愛(ài)心了嘛?這里純手打(所以你可以自由改動(dòng),做出你想的形狀,這就是靈活的地方~)
因?yàn)槲覉D片有500張,所以我想做大一點(diǎn),放更多的圖片,所以元素的個(gè)數(shù)會(huì)比較多,下面是21x21的大小。
記?。?的個(gè)數(shù)一定要比你的圖片數(shù)量少或剛好相等,否則就不是一個(gè)完整的愛(ài)心了!
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、導(dǎo)入圖片
位置確定好了,開(kāi)始獲取所有的圖片
# 這個(gè)是我圖片的所在路徑 img_dir = r"C:\Users\admin\Desktop\頭像" # 獲取這個(gè)文件下的所有文件,因?yàn)闆](méi)有過(guò)濾其他類型文件,所以不要放非圖片文件 # 返回的是一個(gè)列表 imgs = os.listdir(img_dir) # 設(shè)置圖片的尺寸,所有圖片尺寸要保持統(tǒng)一,要有組織有紀(jì)律 img_h = img_w = 192 # 計(jì)算行數(shù),即子列表的個(gè)數(shù) rows = len(map) # 計(jì)算列數(shù),即子列表中元素的個(gè)數(shù) columns = len(map[0])
畫(huà)圖
接下來(lái)就是準(zhǔn)備一個(gè)白色的背景,當(dāng)作畫(huà)布。有了行數(shù)、列數(shù)和圖片的寬高,就可以計(jì)算出整個(gè)畫(huà)布的尺寸了
# 第一個(gè)參數(shù)照著寫(xiě)
# 第二個(gè)參數(shù)需要傳入一個(gè)元組,元組的第一個(gè)參數(shù)是畫(huà)布的寬,第二個(gè)是高
# 第三個(gè)參數(shù)傳入的是畫(huà)布的顏色
# 使用Image.new()方法創(chuàng)建一個(gè)畫(huà)布
figure = Image.new("RGB", (img_w*columns, img_h*rows),"white")
到目前為止,圖片和畫(huà)布都已經(jīng)準(zhǔn)備好了,現(xiàn)在就是將圖片放置在畫(huà)布對(duì)應(yīng)的位置上了,即數(shù)組中元素為0的位置
# 表示圖片的下標(biāo)
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:
# 做個(gè)異常處理,防止有些圖片打開(kāi)失敗,導(dǎo)致程序中斷
try:
# 使用Image.open("圖片路徑")方法獲取圖片對(duì)象
image = Image.open(os.path.join(img_dir, imgs[count]))
except:
continue
# resize((新的寬,新的高))用來(lái)改變圖片的尺寸,接收一個(gè)元組
image = image.resize((img_w, img_h))
# 將修改尺寸后的圖片(image)粘貼(paste)到畫(huà)布(figure)上
# 第一個(gè)參數(shù) 是圖片對(duì)象
# 第二個(gè)參數(shù)是 圖片在畫(huà)布上的位置,相當(dāng)于單元格的位置
figure.paste(image, (img_w*j, img_h*i))
# 使用完一張圖片就要記錄下來(lái),并開(kāi)始使用下一張圖片
count += 1
# 當(dāng)循環(huán)結(jié)束,即表示心型照片圖已經(jīng)完成
# 將畫(huà)好的畫(huà)布顯示出來(lái),給你看到
figure.show()
# 不滿意在調(diào)整二維數(shù)組中0的位置,滿意可以保存到本地,用來(lái)裝逼
# 需要告知程序圖片保存的路徑
figure.save('心型照片墻.png')
到此,心型照片墻就制作出來(lái)了,如果你有女朋友,可以用自己女朋友的照片,背景用紅色,然后發(fā)給你女朋友看,會(huì)不會(huì)更愛(ài)你我就不知道了,也可以寫(xiě)個(gè)i love you~(圖如下)??上覜](méi)有,好氣哦!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信