獲取微信好友頭像并拼成大圖(Python, PIL, Itchat)

如題的一個(gè)小程序,做與學(xué)結(jié)合男图,只有動(dòng)手,才能更快的掌握新的語(yǔ)言

最終會(huì)生成一個(gè)這樣的圖片(保護(hù)隱私件炉,已做模糊處理):


用到的Python包:

  1. Pillow Python的圖像處理庫(kù)斟冕,PIL的一個(gè)Fork版本
  2. Itchat 一個(gè)封裝好的微信接口庫(kù)

源代碼

一 總體流程

  1. 使用Itchat登錄微信并獲取所有好友的頭像圖片地址保存到images/文件夾下
  2. 假設(shè)圖片數(shù)量為n*n磕蛇,使用Pillow創(chuàng)建一個(gè)n行秀撇,n列的正方形底圖
  3. 使用Pillow縮放每張頭像圖片到200px*200px的大小呵燕,那么第二步的底圖大小為width=n*200px,height=n*200px
  4. 將所有縮放后的頭像圖片按照順序粘貼到第二步的底圖上再扭,完成

二 代碼

未安裝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')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淹父,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌困介,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座哩,死亡現(xiàn)場(chǎng)離奇詭異徒扶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)根穷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尘惧,你說(shuō)我怎么就攤上這事喷橙》∮猓” “怎么了悬荣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)核芽。 經(jīng)常有香客問(wèn)我囚戚,道長(zhǎng),這世上最難降的妖魔是什么轧简? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任驰坊,我火速辦了婚禮,結(jié)果婚禮上哮独,老公的妹妹穿的比我還像新娘拳芙。我一直安慰自己,他們只是感情好皮璧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布舟扎。 她就那樣靜靜地躺著,像睡著了一般悴务。 火紅的嫁衣襯著肌膚如雪睹限。 梳的紋絲不亂的頭發(fā)上譬猫,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音羡疗,去河邊找鬼染服。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叨恨,可吹牛的內(nèi)容都是我干的柳刮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痒钝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秉颗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起送矩,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤站宗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后益愈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夷家,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蒸其,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库快。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摸袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出义屏,到底是詐尸還是另有隱情靠汁,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布闽铐,位于F島的核電站蝶怔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兄墅。R本人自食惡果不足惜踢星,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隙咸。 院中可真熱鬧沐悦,春花似錦、人聲如沸五督。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)充包。三九已至副签,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背继薛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工修壕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遏考。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓慈鸠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灌具。 傳聞我的和親對(duì)象是個(gè)殘疾皇子青团,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容