幾天前中秋節的時候用微信好友頭像加生成祝福文字,當時用 Python 代碼來實作時,采用的思路是結合微信好友頭像和點陣字,弄成頭像拼字。
馬上就元旦了,我們把素材換一下,搞一個新玩法:準備用好友頭像拼接成背景圖,用中間透明的中國地圖加以覆寫,即可生成一個酷炫的照片地圖。
話不多說,效果如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SYhVjZwUWM2IWY2QTO1MWO0cjY0IWZyczYkFTNiFmN48CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
整體思路是這樣嬸兒的
- 擷取所有微信好友頭像
- 準備一張透明的中國地圖
- 把微信好友頭像作成照片牆
- 黏合照片牆和透明地圖即可
擷取好友頭像
這個我在之前用微信好友頭像生成漢字時已經做好了、直接拿過來用即可。
如果你不知道怎麼擷取微信好友頭像、請移步到下面:裡面有詳細的擷取微信好友頭像的說明。
用微信好友頭像生成祝福文字,你就是朋友圈最靓的仔準備中國地圖輪廓素材
原理比較簡單,實作起來也不複雜,最最重要的是擷取中間透明的地圖輪廓圖檔。我們直接在網上下載下傳一個中國輪廓透明地圖:
拼接圖檔牆
我們用微信好友頭像拼接成一張大的圖檔牆,如果你願意也可以自己PS一下。
不過我們這裡用Python裡面的 PIL 圖檔處理子產品來操作,主要是将小圖拼接成與地圖輪廓圖同等大小的背景圖(圖檔牆):
代碼如下:
def combine_pic(folder,unit_size):
"""用圖檔生成一張地圖大小的照片牆
"""
# 讀取地圖輪廓圖
img = Image.open("ChinaMap.png")
w,h = img.size
#建立與主圖一樣大的白色底圖
new_img = Image.new('RGB',(w,h),'#FFFFFF')
#根據小格尺寸,計算大圖可容納小圖數量
y_index = h//unit_size
x_index = w//unit_size
pic_list = []
for item in os.listdir(folder):
#對檔案夾中的 jpg 圖檔格式篩選
if item.endswith(".jpg") or item.endswith(".jpeg") :
pic_list.append(item)
#擷取素材圖檔數目
total = len(pic_list)
x=0
y=0
for i in range(x_index*y_index):
#列印目前進度
print(f"目前進度{i}/{x_index*y_index}")
try:
# 對素材圖縮放至小格大小
test = Image.open(f"{folder}/" + pic_list[i%total]).resize((unit_size,unit_size), Image.ANTIALIAS)
except IOError:
print("圖檔讀取失敗,跳過該圖檔") # 圖檔會讀取失敗
continue
#将縮放成小格的素材圖按順序貼到白色底圖上
new_img.paste(test,(x*unit_size,y*unit_size))
x+=1
if x==x_index:
x=0
y+=1
print("照片牆合成完畢")
#儲存照片牆
new_img.save("PhotoWall.jpg",quality=100)
paste_map() #調用地圖合成函數
地圖輪廓貼圖
到目前為止我們就有了2張圖檔,一張透明的中國地圖,以及一張用微信好友頭像拼接的圖檔牆。
有了圖檔牆以及要覆寫在上面的地圖輪廓圖,隻要将輪廓圖貼在圖檔牆上即可收工。
def paste_map():
"""用透明地圖覆寫頭像圖檔
"""
#讀取合成後的素材圖
src1 = Image.open("PhotoWall.jpg")
#讀取地圖輪廓圖
src2 = Image.open("ChinaMap.png")
src1.paste(src2,(0,0),src2)
savename = "result{}.png".format(unit_size)
src1.save(savename)
print("頭像地圖制作完畢!")
os.system('pause') #手動退出提示
整體流程隻需要4個步驟;
- 準備好圖檔(微信好友頭像)
- 用圖檔生成一張圖檔牆
- 準備一張透明的地圖
- 将圖檔牆和地圖整合
完整代碼:
https://github.com/huaisha1224/Python-Example
注意事項
- 由于圖檔牆和地圖黏合時多出來的部分會被透明處理,是以會看不到
- 生成圖檔牆的時候請根據頭像數量多嘗試小圖大小