在朋友圈中你肯定會見到過下面這樣的照片,由數張照片拼接成一張具有規則圖案形狀的照片墻。
其實這樣的一張照片也可以用 Python 實現,主要用到的是 python 中的 Image 庫;制作之前需要一些準備:
作為照片背景墻的矢量圖(矢量圖是圖案的輪廓填充是透明的,其他部分是非透明的白色的;利用PS就可以簡單制作,制作方法在下面);
填充照片墻的圖片集;
python3.6+ 版本的安裝及 Image 包;
原本這篇文章打算想結合python的另一個包 itchat 獲取微信好友頭像作為圖片集,來進行實戰。
但不幸的是,微信官方在6月份的時候只限制新注冊用戶,老注冊用戶在 itchat 上能夠正常登陸使用,但在今年9月份新老用戶都進行了限制,關閉了所有微信用戶在 itchat 平臺上的登陸接口,好友信息我們也就沒辦法快速獲取.........
在找圖片集的時候,建議大家可以把自己手機里的相冊打包成一個文件夾,也可以利用爬蟲技術在網上爬取一些自己喜歡的圖片打包成一個集合,作為一個圖片集;畢竟,圖片不重要,重要的是方法。
作為背景墻的矢量圖制作方法如下:
選取一張里面有自己中意的輪廓的圖(圖片背景墻的好壞取決于它的輪廓)
利用ps打開圖片,利用 快速選擇工具 選取自己中意的輪廓,把透明度降為0;
再次利用快速選擇工具 選取把透明度降為0外的部分,用純白顏色填沖;
3.導出圖片(PS:因為圖片后面要用到,所以路徑中盡可能不要出現中文)
所有工作準備完畢之后,接下來就是要用python進行處理,定制照片墻的制作原理就是:
讀取圖片背景墻,用Image繪制一個相應大小的模板片;
遍歷圖片集獲取圖片數量,根據背景墻圖片大小以及圖片集數量,找到一個圖片合適的尺寸;
按照尺寸把圖片集的圖片依次拼接到繪制的新的模板片上;
最后根據背景墻輪廓的透明度進行二次拼接,以達到能夠形成目標輪廓的目標。
制作好的圖片效果如下:
以上,就是照片墻的基本繪制過程,部分代碼如下:
from PIL import Image
import os
id ='zuguo'
img_path ='C:/Users/FREEDOM/Desktop/timg.png'
#自己找的的模板圖片存儲地址,需要是矢量圖
#這個是我獲取圖片存放的文件夾,根據自己情況進行設置;
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')#創建新的圖片,大小與原圖片一樣
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'目前進度為{i}{x_index*y_index}')
try:
#利用 Image.resize()來規定圖片大小,其中Image.ANATILAS表示的是高質量圖片;
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('讀取一張圖片失敗')
#一排已經掃描完畢
if x==x_index:
x =0
y +=1
print('素材掃描完畢')
下面這幾張圖片就是我已將做好的照片墻,是為了多國慶檔電影做簡單分析用的,感覺不錯的話,自己也可以嘗試一下,有什么疑問也可以在下面留言給我
完整源碼私信柚子:‘資料’分享下給你們