近日,朋友圈流行起了发九宫格的图片,就是将一张图片切割成九张图,然后在朋友圈发九张,但看起来就像一张一样,这不,我楼下的小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('@img@%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学习笔记