Python3之好友矩陣圖

簡單介紹下本篇文章幕後小背景吧——

某週末,炒雞熱

喫完中午飯,和某人在家靜靜地待著刷劇,聽着窗外似有若無的知了蟲鳴

突然,腦中靈光閃現,想起了最近正在鼓搗的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_WIDTHHEAD_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。隨緣回覆,無量天尊

公衆號:陸玖神通

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章