簡單介紹下本篇文章幕後小背景吧——
某周末,炒雞熱
吃完中午飯,和某人在家靜靜地呆着刷劇,聽着窗外似有若無的知了蟲鳴
突然,腦中靈光閃現,想起了最近正在鼓搗的PIL
于是轉頭沖某人邪魅一笑:想不想 炸一波 朋!友!圈!?
某人:蛤?
··· ···
說幹就幹!小本本小本本抱過來!小闆凳小闆凳坐起來!
确認語言環境:Pyhton3
####-第一步-
pip導入需要用到的四個庫
import itchat
import os
import math
import PIL.Image as Image
####-第二步-
指定好友頭像緩存目錄,因為頭像檔案數量比較多,是以在目前路徑下添加目錄 ‘/img/’ ;若無此目錄,捕獲 FileNotFoundError 異常,建立目錄,繼續調用函數。
# 好友頭像緩存路徑
IMG_DIR = os.getcwd() + '/img/'
# 下載下傳好友頭像
def download_imgs(firends):
num = 1
try:
for firend in firends:
img_name = str(num) + '.jpg'
img = itchat.get_head_img(userName=firend['UserName'])
with open(IMG_DIR + img_name, 'wb') as file:
file.write(img)
print(u'已下載下傳:%d' % num)
num += 1
return num
except FileNotFoundError:
os.mkdir(IMG_DIR)
return download_imgs(firends)
####-第三步-
process_imgs() 比較簡單,主要是讀取頭像緩存目錄,加工處理擷取:
頭像清單 | 頭像總計數 | 列數 | 行數 |
---|---|---|---|
img_list | img_num | max_column | max_row |
列數與行數為總計數平方根向下取整,是以餘出來的好友将會無情的被抛除于矩陣之外。
# 加工頭像清單資訊
def process_imgs():
# 頭像清單
img_list = []
for root, dirs, files in os.walk(IMG_DIR):
for file in files:
if "jpg" in file and os.path.getsize(os.path.join(root, file)) > 0:
img_list.append(os.path.join(root, file))
img_num = len(img_list)
max_column = int(math.sqrt(img_num))
max_row = int(math.sqrt(img_num))
return img_list, img_num, max_column, max_row
####-第四步-
萬事具備!就差這一哆嗦!
準備好合成圖像儲存路徑 MERGE_PATH
設定好單個好友頭像等比例壓縮參數 HEAD_IMG_WIDTH 和 HEAD_IMG_HEIGHT
# 合成矩陣圖儲存路徑(例如:A/B/C)
MERGE_PNG = '/heiheipiupiupiu.png'
MERGE_PATH = 'A/B/C' + MERGE_PNG
# 好友頭像壓縮(數字越大,合成圖像品質越高)
HEAD_IMG_WIDTH = 80
HEAD_IMG_HEIGHT = 80
# 合成好友頭像矩陣圖
def merge_imgs():
img_list, img_num, max_line, max_row = process_imgs()
print(max_line, max_row, img_num)
num = 0
imgs_count = max_line * max_row
# 建立空白畫闆
white_board = Image.new('RGBA', (HEAD_IMG_WIDTH * max_line, HEAD_IMG_HEIGHT * max_row))
# 逐行列繪制好友頭像
for i in range(0, max_row):
for j in range(0, max_line):
head_img = Image.open(img_list[num])
# 等比例壓縮頭像
temp_head_img = head_img.resize((HEAD_IMG_WIDTH, HEAD_IMG_HEIGHT))
# 繪畫位置
place = (int(j % max_row * HEAD_IMG_WIDTH), int(i % max_row * HEAD_IMG_HEIGHT))
# 繪制粘貼
white_board.paste(temp_head_img, place)
num = num + 1
if num >= len(img_list):
break
if num >= imgs_count:
break
print(white_board.size)
white_board.save(MERGE_PATH)
####-第五步-
做事手腳幹淨些,清除好友頭像緩存,不給機器記憶體添麻煩
# 清除好友頭像緩存
def clean_imgs(path):
for img in os.listdir(path):
i = os.path.join(path, img)
if os.path.isfile(i):
os.remove(i)
####-第六步-
照例加上主函數,擷取好友資訊清單,使線程優雅地運轉起來,泡上一杯清茶···
下載下傳,呦呦呦
好嘞!
合成!走你~
清~除~
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
#好友清單
firends = itchat.get_friends(update=True)
print('[···開始下載下傳好友頭像···]')
num = download_imgs(firends)
count = num - 1
print(u'[···頭像下載下傳完成,總計下載下傳數量為:%d···]' % count)
print('[···開始合成好友頭像···]')
merge_imgs()
print('[···合成好友頭像完成···]')
print('[···開始清除好友頭像緩存···]')
clean_imgs(IMG_DIR)
print('[···清除緩存完成···]')
小可愛,快傳回你的合成圖像儲存路徑下看看吧!拿出那張圖檔,你就可以去盆友圈**分(zhuang)享(bi)**了···
像這樣:(保護好友隐私,另加深度模糊處理,真實程式暫不支援模糊特效噢)

有更多精彩或想提問題可掃下方二維碼,關注背景私M。随緣回複,無量天尊