在朋友圈中你肯定會(huì)見(jiàn)到過(guò)下面這樣的照片,由數(shù)張照片拼接成一張具有規(guī)則圖案形狀的照片墻。
其實(shí)這樣的一張照片也可以用 Python 實(shí)現(xiàn),主要用到的是 python 中的 Image 庫(kù);制作之前需要一些準(zhǔn)備:
作為照片背景墻的矢量圖(矢量圖是圖案的輪廓填充是透明的,其他部分是非透明的白色的;利用PS就可以簡(jiǎn)單制作,制作方法在下面);
填充照片墻的圖片集;
python3.6+ 版本的安裝及 Image 包;
原本這篇文章打算想結(jié)合python的另一個(gè)包 itchat 獲取微信好友頭像作為圖片集,來(lái)進(jìn)行實(shí)戰(zhàn)。
但不幸的是,微信官方在6月份的時(shí)候只限制新注冊(cè)用戶,老注冊(cè)用戶在 itchat 上能夠正常登陸使用,但在今年9月份新老用戶都進(jìn)行了限制,關(guān)閉了所有微信用戶在 itchat 平臺(tái)上的登陸接口,好友信息我們也就沒(méi)辦法快速獲取.........
在找圖片集的時(shí)候,建議大家可以把自己手機(jī)里的相冊(cè)打包成一個(gè)文件夾,也可以利用爬蟲(chóng)技術(shù)在網(wǎng)上爬取一些自己喜歡的圖片打包成一個(gè)集合,作為一個(gè)圖片集;畢竟,圖片不重要,重要的是方法。
作為背景墻的矢量圖制作方法如下:
選取一張里面有自己中意的輪廓的圖(圖片背景墻的好壞取決于它的輪廓)
利用ps打開(kāi)圖片,利用 快速選擇工具 選取自己中意的輪廓,把透明度降為0;
再次利用快速選擇工具 選取把透明度降為0外的部分,用純白顏色填沖;
3.導(dǎo)出圖片(PS:因?yàn)閳D片后面要用到,所以路徑中盡可能不要出現(xiàn)中文)
所有工作準(zhǔn)備完畢之后,接下來(lái)就是要用python進(jìn)行處理,定制照片墻的制作原理就是:
讀取圖片背景墻,用Image繪制一個(gè)相應(yīng)大小的模板片;
遍歷圖片集獲取圖片數(shù)量,根據(jù)背景墻圖片大小以及圖片集數(shù)量,找到一個(gè)圖片合適的尺寸;
按照尺寸把圖片集的圖片依次拼接到繪制的新的模板片上;
最后根據(jù)背景墻輪廓的透明度進(jìn)行二次拼接,以達(dá)到能夠形成目標(biāo)輪廓的目標(biāo)。
制作好的圖片效果如下:
以上,就是照片墻的基本繪制過(guò)程,部分代碼如下:
from PIL import Image
import os
id ='zuguo'
img_path ='C:/Users/FREEDOM/Desktop/timg.png'
#自己找的的模板圖片存儲(chǔ)地址,需要是矢量圖
#這個(gè)是我獲取圖片存放的文件夾,根據(jù)自己情況進(jìn)行設(shè)置;
folder ='C:/Users/FREEDOM/Desktop/{}'.format(id)
#拼接后圖片的存放位置
save_pic_path ='C:/Users/FREEDOM/Desktop/{}.jpg'.format(id)
img =Image.open(img_path)
w,h =img.size#獲取圖片大小
new_img = Image.new('RGB',(w,h),'#FFFFFF')#創(chuàng)建新的圖片,大小與原圖片一樣
unit_size =60
y_index = h//unit_size
x_index = w//unit_size#雙斜杠表示:先做除法,再向下取整;
pic_list = []#存放圖片位置
for i in os.listdir(folder):
print(i)
if i.endswith('.jpg'):
pic_list.Append(i)
total =len(pic_list)
x = 0
y = 0
for i in range(x_index*y_index):
'''
把folder中存放的圖片集貼入到你想要貼的圖片上,
'''
print(f'目前進(jìn)度為{i}{x_index*y_index}')
try:
#利用 Image.resize()來(lái)規(guī)定圖片大小,其中Image.ANATILAS表示的是高質(zhì)量圖片;
test = Image.open('{}/{}'.format(folder,pic_list[i%total])).resize((unit_size,unit_size),Image.ANTIALIAS)
new_img.paste(test, (x * unit_size, y * unit_size))
x += 1
except IOError:
print('讀取一張圖片失敗')
#一排已經(jīng)掃描完畢
if x==x_index:
x =0
y +=1
print('素材掃描完畢')
下面這幾張圖片就是我已將做好的照片墻,是為了多國(guó)慶檔電影做簡(jiǎn)單分析用的,感覺(jué)不錯(cuò)的話,自己也可以嘗試一下,有什么疑問(wèn)也可以在下面留言給我
完整源碼私信柚子:‘資料’分享下給你們






