python生成微信好友頭像心形照片牆

使用itchat庫,實現微信的登錄和好友信息的獲取,將獲取的好友頭像進行拼接生成照片牆,拼接時加限制條件生成心形照片牆,

獲取好友個性簽名生成詞雲。

涉及:

1. itchat的簡單使用

2. 圖像拼接

3. 按照指定規則進行圖像拼接,生成心形圖像

4. wordcloud生成詞雲

詳解:

  • 相關庫的安裝

pip install itchat     微信接口模塊

pip install wordcloud    詞雲模塊

pip install jieba      jieba分詞模塊

  • 登錄微信,獲取好友頭像及個性簽名

    def get_wechat(self):
        try:
            # 加上hotReload=True,就會保留登錄的狀態,至少在後面的幾次登錄過程中不會再次掃描二維碼,
            # 該參數生成一個靜態文件itchat.pkl用於存儲登錄狀態
            # itchat.auto_login(hotReload=True)
            # 掃碼登錄
            itchat.auto_login()
        except:
            print("請檢查網絡,再重試")
        # 獲取微信好友
        friends = itchat.get_friends(update=True)
        # 創建photo_image文件夾來保存微信頭像圖片
        if not os.path.exists('photo_image'):
            # 若文件夾不存在,則創建目錄
            os.mkdir('photo_image')
        num=0
        for friend in friends:
            # 根據用戶名獲取對應的微信頭像
            img=itchat.get_head_img(userName=friend['UserName'])
            # 圖片路徑名
            img_name=''.join(['photo_image/img',str(num),'.jpg'])
            # 保存圖片
            with open(img_name,'wb') as f:
                f.write(img)
            num+=1

            # 獲取生成詞雲需要的所有好友的個性簽名
            signature=friend['Signature'].strip()
            # 剔除個性簽名爲空以及含span標籤的,將所有簽名通過空格拼成字符串
            if len(signature)>0 and not '<span class=' in signature:
                self.signature_txt+=signature+' '
  • 拼接頭像,生成照片牆

    def merge_image(self):
        # 獲取指定路徑下的文件列表
        all_image=os.listdir('photo_image')
        # 設定每個頭像的大小
        each_size=int(math.sqrt(float(1024*1024)/len(all_image)))
        # 照片牆的行數
        lines=int(1024/each_size)
        print(lines)
        # 創建Image對象,初始化大小
        image=Image.new('RGBA',(1024,1024))
        x,y=0,0
        for i in range(len(all_image)):
            try:
                img = Image.open(''.join(['photo_image/img', str(i), '.jpg']))
                # 重新設置圖像大小
                img = img.resize((each_size, each_size), Image.ANTIALIAS)
                # 根據x,y座標位置拼接圖像
                image.paste(img, (x * each_size, y * each_size))
                # 更新下一張圖像位置
                x += 1
            except:
                pass
            finally:
                # 一行一行拼接
                if x == lines:
                    x = 0
                    y += 1

        # 保存生成的照片牆
        # RGBA意思是紅色,綠色,藍色,Alpha的色彩空間,Alpha指透明度。而JPG不支持透明度,所以要麼丟棄Alpha,要麼保存爲.png文件
        image.save('photo_image/photo_wall.png')
        itchat.send_msg('好友頭像照片牆', 'filehelper')
        # 發送圖像到微信文件傳輸助手,打開手機微信可查看
        itchat.send_image('photo_image/photo_wall.png','filehelper')
  • 心形函數

在直角座標系中,愛心線的方程的python 表達爲:

x** 2+ y** 2 + a * x= a * sqrt(x** 2+y** 2) 

x** 2+ y** 2 - a * x= a * sqrt(x** 2+y** 2)

# 計算心形,判斷圖像的座標是否在心形函數內
    @classmethod
    def get_heart_shape(cls,x,y):
        y1 = 0.618 * np.abs(x) - 0.7 * np.sqrt(262144 - x ** 2)
        y2 = 0.618 * np.abs(x) + 0.7 * np.sqrt(262144 - x ** 2)
        if y<y1 or y>y2:
            return False
        else:
            return True
  • 拼接心形照片牆

# 拼接爲心形照片牆
    def merge_love_image(self):
        # 獲取指定路徑下的文件列表
        all_image=os.listdir('photo_image')
        # 設定每個頭像的大小
        each_size=int(math.sqrt(float(1024*1024)/len(all_image)))

        # 一行的圖像個數,若爲偶數個,則+1轉換爲奇數個,修改每個圖像的大小,使最後的心形對稱好看
        num=int(1024/each_size)
        if num%2==0:
            num+=1
        each_size=int(1024/num)

        # 照片牆的行數
        lines=int(1024/each_size)
        print(lines)
        # 創建Image對象,初始化大小,其大小不直接設定爲(1024*1024),因爲照片拼接出的尺寸不是正好等於1024,故用實際拼接的尺寸
        image=Image.new('RGBA',(lines*each_size,lines*each_size))
        x,y=0,0
        for i in range(len(all_image)):
            try:
                # 由於圖像座標從(0,0)開始,而心形函數對應左上角座標爲(-512,512),故此在判斷座標時,稍作轉換
                is_heart_part=self.get_heart_shape(-512+x * each_size,512-y * each_size)
                if not is_heart_part:
                    pass
                else:
                    img = Image.open(''.join(['photo_image/img', str(i), '.jpg']))
                    # 重新設置圖像大小
                    img = img.resize((each_size, each_size), Image.ANTIALIAS)
                    # 根據x,y座標位置拼接圖像
                    image.paste(img, (x * each_size, y * each_size))
                # 更新下一張圖像位置
                x += 1
            except:
                pass
            finally:
                # 一行一行拼接
                if x == lines:
                    x = 0
                    y += 1
  • 個性簽名生成詞雲

# 生成詞雲
    def get_wordcloud(self):
        try:
            image = np.array(Image.open('./namei.jpeg'))
            # jieba分詞
            signature_txt_list = jieba.cut(self.signature_txt, cut_all=False)
            jieba_txt = ' '.join(signature_txt_list)
            # 生成詞雲
            wordcloud = WordCloud(font_path=r'C:\Windows\Fonts\msyh.ttc',  # 調用系統自帶字體(微軟雅黑)
                                  background_color='white',  # 背景色
                                  max_words=500,  # 最大顯示單詞數
                                  max_font_size=60,  # 頻率最大單詞字體大小
                                  mask=image  # 自定義顯示的效果圖
                                  ).generate(jieba_txt)
            plt.imshow(wordcloud, interpolation='bilinear')
            plt.axis('off')
            plt.show()
            # 保存爲圖片
            wordcloud.to_file('./signature_wordcloud.png')
            itchat.send_msg('好友個性簽名詞雲', 'filehelper')
            # tips: 發送的圖片名稱必須爲英文,若爲中文,會發送失敗
            itchat.send_image('signature_wordcloud.png', 'filehelper')
        except:
            print('詞雲生成失敗,請重試')

運行結果:

運行程序,彈出二維碼,掃描登錄

等待圖像下載拼接,結果將發送到微信的文件傳輸助手

直接拼接的照片牆

心形圖

心形照片牆

個性簽名詞雲

背景圖

詞雲

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