1. 程式人生 > >用Python分割九宮格圖片發朋友圈

用Python分割九宮格圖片發朋友圈

       近日,朋友圈流行起了發九宮格的圖片,就是將一張圖片切割成九張圖,然後在朋友圈發九張,但看起來就像一張一樣,這不,我樓下的小A就狂發了一堆。

      看起來好像挺好玩的,於是就問了小A他是怎樣做的,他跟我說要下載一個軟體,然後就這樣那樣操作就可以了。

       作為一個有理想(hen)有抱負(lan)的程式設計師,怎麼可能會為了這麼一個小功能就去下載一個軟體,不用的時候還得把他給刪了,於是乎就想到了要不自己寫個程式碼,然後把這個功能放在微信小號上,只要給小號發張圖片,就能將處理好後的圖片返回給你。想想還是挺美好,那麼,說幹就幹。(效果如下)

        這樣,集齊九張圖片就可以去發朋友圈了,非開發人員看到這裡就可以加下小A的微訊號,去試試這個技能了,公眾號裡回覆 九宮圖 就能獲取小A的微信名片加好友了。

        至於程式設計師們,我們可以詳細來聊聊這個功能開發的思路跟具體程式碼。

本次用到的環境:Win10 or Ubuntu 

語言:Pyhton3.6.4

第三方庫:Pillow,itchat

九宮格分割程式碼來源:https://blog.csdn.net/mico_cmm/article/details/81747974

itchat的使用可以參考之前的文章

我們先來看看九宮格分割的思路:

1 首先,你要有一張要發朋友圈的原圖,長寬就看你自己安排了,不過儘量是正方形的效果會好點。     

 2 根據圖片中最長的那一邊的長度a來生成一個邊長為a的白底正方形,然後將原圖居中放置到邊長為a的白底正方形中央。如下圖所示:我選擇了一張長為800,寬為500的原圖,我們要做的就是生成一個邊長為800的白底正方形,然後將原圖放置到正方形的正中央。

3 就是將圖片九等分,切割成九張圖

4 利用itchat接收使用者傳送過來的圖片,對圖片處理後返回使用者九張處理後的圖片

生成白底正方形:

from PIL import Image
# 先將原圖填充為正方形
def fill_image(image):
    # 獲取圖片的長寬
    width, height = image.size
    # 選取長和寬中較大值作為新圖片的邊長
    new_image_length = width if width > height else height
    # # 生成新圖片[白底]
    new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white')  # 注意這個函式!
    # # 將之前的圖貼上在新圖上,居中
    if width > height  :  # 原圖寬大於高,則填充圖片的豎直維度  #(x,y)二元組表示貼上上圖相對下圖的起始位置,是個座標點。
        new_image.paste(image, (0, int((new_image_length - height) / 2)))
    else:
        new_image.paste(image, (int((new_image_length - width) / 2) ,0))
    # 返回圖片
    return new_image    

分割圖片:

# 分割圖片
def cut_image(image):
    width, height = image.size
    item_width = int(width / 3)  # 因為朋友圈一行放3張圖。
    item_height = int(height / 3)
    box_list = []
    # (left, upper, right, lower)
    for i in range(0 ,3):
        for j in range(0 ,3):
         # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
            box = ( j *item_width , i *item_height ,( j +1 ) *item_width ,( i +1 ) *item_height)
            box_list.append(box)
    image_list = [image.crop(box) for box in box_list]
    return image_list

儲存圖片:

# 儲存圖片
def save_images(image_list):
    index = 1
    for image in image_list:
        # 在windows下地址需要雙\進行轉義,linux下就直接資料夾地址:/home/image/
        image.save('C:\\Users\Administrator\\Desktop\\九宮格\\'+str(index) + '.jpg')
        index += 1
    # 點選按鈕,實現圖片分割

圖片處理的主函式:

def cTofClicked(image_name):
     # 開啟一張新圖片
    image =Image.open(image_name)
     # 填充圖片
    image = fill_image(image)
    # 切割圖片
    image_list = cut_image(image)
    # 儲存圖片
    save_images(image_list)

通過Itchat將功能部署在微訊號上:

import itchat
from itchat.content import *
import time

# 註冊資訊類,如果有人發圖片給你,則進入這個函式進行操作
@itchat.msg_register([PICTURE])
def download_files(msg):
    # 將接收到的圖片儲存到py所在資料夾內
    msg['Text'](msg['FileName'])
    # 將圖片傳入到函式中,進行處理
    cTofClicked(msg['FileName'])
    # 將處理好的檔案一張張按順序傳送給使用者
    for i in range(1,10):
        time.sleep(1)
        ls="C:\\Users\Administrator\\Desktop\\九宮格\\"+str(i)+".jpg"
        itchat.send('@[email protected]%s' % ls,toUserName=msg['FromUserName'])

# 如果是在linux環境下,需要新增引數enableCmdQR,將二維碼通過命令列的形式展示出來
# itchat.auto_login(hotReload=True,enableCmdQR=2)
itchat.auto_login(hotReload=True)
itchat.run()

       最後,執行上面這些程式碼,掃碼登陸就可以使用了,如果你想24小時都能用的話,最好是有自己的伺服器,然後後臺一直掛著就可以了。

歡迎大家關注我的微信公眾號Python小黑屋

python學習資源/有趣的python文章/python學習筆記