近日,朋友圈流行起了发九宫格的图片,就是将一张图片切割成九张图,然后在朋友圈发九张,但看起来就像一张一样,这不,我楼下的小A就狂发了一堆。

PYTHON 微信 发朋友圈 api 用python发朋友圈_Python

      看起来好像挺好玩的,于是就问了小A他是怎样做的,他跟我说要下载一个软件,然后就这样那样操作就可以了。

       作为一个有理想(hen)有抱负(lan)的程序员,怎么可能会为了这么一个小功能就去下载一个软件,不用的时候还得把他给删了,于是乎就想到了要不自己写个代码,然后把这个功能放在微信小号上,只要给小号发张图片,就能将处理好后的图片返回给你。想想还是挺美好,那么,说干就干。(效果如下)

PYTHON 微信 发朋友圈 api 用python发朋友圈_保存图片_02

        这样,集齐九张图片就可以去发朋友圈了,非开发人员看到这里就可以加下小A的微信号,去试试这个技能了,公众号里回复 九宫图 就能获取小A的微信名片加好友了。

        至于程序员们,我们可以详细来聊聊这个功能开发的思路跟具体代码。

本次用到的环境:Win10 or Ubuntu 

语言:Pyhton3.6.4

第三方库:Pillow,itchat

九宫格分割代码来源:

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

Python微信聊天机器人

我们先来看看九宫格分割的思路:

1 首先,你要有一张要发朋友圈的原图,长宽就看你自己安排了,不过尽量是正方形的效果会好点。     

 2 根据图片中最长的那一边的长度a来生成一个边长为a的白底正方形,然后将原图居中放置到边长为a的白底正方形中央。如下图所示:我选择了一张长为800,宽为500的原图,我们要做的就是生成一个边长为800的白底正方形,然后将原图放置到正方形的正中央。

3 就是将图片九等分,切割成九张图

4 利用itchat接收用户发送过来的图片,对图片处理后返回用户九张处理后的图片

PYTHON 微信 发朋友圈 api 用python发朋友圈_保存图片_03

PYTHON 微信 发朋友圈 api 用python发朋友圈_保存图片_04

 

生成白底正方形:

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('@img@%s' % ls,toUserName=msg['FromUserName'])

# 如果是在linux环境下,需要添加参数enableCmdQR,将二维码通过命令行的形式展示出来
# itchat.auto_login(hotReload=True,enableCmdQR=2)
itchat.auto_login(hotReload=True)
itchat.run()

       最后,运行上面这些代码,扫码登陆就可以使用了,如果你想24小时都能用的话,最好是有自己的服务器,然后后台一直挂着就可以了。