如題的一個(gè)小程序,做與學(xué)結(jié)合男图,只有動(dòng)手,才能更快的掌握新的語(yǔ)言
最終會(huì)生成一個(gè)這樣的圖片(保護(hù)隱私件炉,已做模糊處理):
用到的Python包:
一 總體流程
- 使用Itchat登錄微信并獲取所有好友的頭像圖片地址保存到
images/
文件夾下 - 假設(shè)圖片數(shù)量為n*n磕蛇,使用Pillow創(chuàng)建一個(gè)n行秀撇,n列的正方形底圖
- 使用Pillow縮放每張頭像圖片到200px*200px的大小呵燕,那么第二步的底圖大小為width=n*200px,height=n*200px
- 將所有縮放后的頭像圖片按照順序粘貼到第二步的底圖上再扭,完成
二 代碼
未安裝itchat和Pillow的需要先安裝這兩個(gè)包夜矗,我用的是Anaconda(一個(gè)python的包控制軟件紊撕,可以在安裝python包的時(shí)候把所有依賴補(bǔ)全),用pip的同學(xué)可能在安裝pillow的時(shí)候需要解決一些依賴問(wèn)題。
conda install itchat
conda install pillow
首先登陸微信并獲取所有好友的頭像圖片地址并下載到images/
文件夾下
#導(dǎo)入itchat包
import itchat
#下載所有好友頭像并存儲(chǔ)
def download_images(frined_list):
image_dir = "./images/"
#計(jì)數(shù)器区赵,保存每一個(gè)頭像圖片名為 num.jpg
num = 1
for friend in frined_list:
#賦值當(dāng)前需要保存的圖片的名稱
image_name = str(num)+'.jpg'
num+=1
#使用itchat自帶函數(shù)get_head_img獲取好友頭像圖片的二進(jìn)制流
#friend["UserName"]為當(dāng)前好友的唯一標(biāo)識(shí)符
img = itchat.get_head_img(userName=friend["UserName"])
#將圖片二進(jìn)制流img變量寫(xiě)入到images/文件夾下對(duì)應(yīng)jpg文件
with open(image_dir+image_name, 'wb') as file:
file.write(img)
if __name__ == '__main__':
#自動(dòng)登陸,會(huì)出現(xiàn)二維碼从媚,掃碼確認(rèn)后登陸微信
itchat.auto_login()
#get_friends獲取所有好友信息函數(shù)患整,返回list存儲(chǔ)到friends變量
friends = itchat.get_friends(update=True)
#把好友信息傳入下載圖片函數(shù)
download_images(friends)
現(xiàn)在在當(dāng)前目錄下會(huì)有一個(gè)images/
文件夾各谚,里面保存了所有微信好友的頭像圖片到千。因?yàn)樾枰粡堃粡埾螺d,所以這個(gè)過(guò)程可能時(shí)間會(huì)比較長(zhǎng)需要幾分鐘膀息。
接著潜支,把所有頭像圖片合并:
from PIL import Image
import os
import math
#合并所有好友頭像
#path為存儲(chǔ)頭像圖像的文件夾相對(duì)于當(dāng)前路徑的相對(duì)路徑冗酿,這里應(yīng)該為'images/'
def merge_images(path):
print("Merging head images......")
#設(shè)置每個(gè)圖片需要縮放到的大小
photo_width = 200
photo_height = 200
#保存所有本地圖片的絕對(duì)地址
photo_list = []
#頭像圖片文件夾的絕對(duì)路徑
dirName = os.getcwd()+path
#os.walk用來(lái)遍歷某一個(gè)文件夾下的所有文件夾和文件裁替,遞歸便利弱判,os是python自帶庫(kù)
#具體參數(shù)用法參考python手冊(cè)
for root, dirs, files in os.walk(dirName):
for file in files:
#遍歷所有文件锥惋,如果文件名包含jpg則獲取該文件絕對(duì)路徑添加到photo_list
#os.path.join(root, file)拼接為這個(gè)文件的絕對(duì)路徑
if "jpg" in file and os.path.getsize(os.path.join(root, file)) > 0:
photo_list.append(os.path.join(root, file))
pic_num = len(photo_list)
#合并圖片的列數(shù)
line_max = int(math.sqrt(pic_num))
#合并圖片的行數(shù)
row_max = int(math.sqrt(pic_num))
print(line_max, row_max, pic_num)
#如果好友太多行數(shù)大于20行則限制為20行
if line_max > 20:
line_max = 20
row_max = 20
num = 0
#需要合并的圖片總數(shù)
pic_max=line_max*row_max
#新建底圖净刮,長(zhǎng)款為行數(shù)*200px,列數(shù)*200px
toImage = Image.new('RGBA',(photo_width*line_max, photo_height*row_max))
#循環(huán)粘貼每一個(gè)頭像圖片
for i in range(0,row_max):
for j in range(0,line_max):
#讀取對(duì)應(yīng)的頭像圖片
pic_fole_head = Image.open(photo_list[num])
#把圖片伸縮到設(shè)置的大邪啤(200px*200px)
tmppic = pic_fole_head.resize((photo_width,photo_height))
#計(jì)算圖片粘貼的位置
loc = (int(j%row_max*photo_width),int(i%row_max*photo_height))
#把頭像圖片粘貼到底圖對(duì)應(yīng)位置
toImage.paste(tmppic,loc)
num = num+1
if num >= len(photo_list):
break
if num >= pic_max:
break
print(toImage.size)
#保存圖片
toImage.save('merged.png')