恰逢公司成立十周年,发条信息以示祝贺。文字不多,那就上图吧。一张不够?来九张。可九张又太分散,于是就有了把一张大图分成九份的经典操作——九宫格图片。
年底了,谁不想凑个热闹呢?只要图片准备好,再配合一段Python代码,就能轻松搞定。测试用的图片长宽像素最好是3的倍数,比如1080×1080,这样每条边刚好三等分。网上其实有不少在线工具,但大多需要你提供个人信息才能用。虽然个人信息不值一提,但心里总归不太舒服,索性自己写段代码来省事。代码分享如下:
import cv2
import numpy as np
def split_image(image_path):
img = cv2.imread(image_path) # 读取图片文件
imgheight = img.shape[0] # 图片高度
imgwidth = img.shape[1] # 图片宽度
M = imgheight // 3 # 高度三等分取整
N = imgwidth // 3 # 宽度三等分取整
# 将图片均分为9部分
tiles = [img[x:x+M, y:y+N] for x in range(0, imgheight, M) for y in range(0, imgwidth, N)]
# 按序命名并保存,保存路径请自行设置
for i, tile in enumerate(tiles):
cv2.imwrite("YourPathName/" + f"tile_{i}.png", tile)
if __name__ == "__main__":
split_image("YourPathName/YourImageFile.png") # 指定图片文件路径,扩展名不限于png
需要安装Python插件,执行一行命令即可:
pip install opencv-python
如果有其他依赖,依葫芦画瓢安装就行。
如果图片的长宽正好是3的倍数,程序会将原图等分成9份;否则生成的图片数量会多于9个。在后端服务器代码中,会让图片边长强制调整为3的倍数后再分割。因此测试时请留意这个细节。
微信朋友圈发图时,通常需要按顺序插入1~9个格子,只要把生成的9个分图(文件名0~8编号)按顺序对应放进去即可。
效果如下:
图片编号与顺序

图片名称可在代码中自行设定。按照当前输出设置,编号从0到8,如上图所示。
年底发信息更加频繁,后续或许会出一个可运行的窗口程序,打开程序、选文件、输出结果,一步到位。不过手边放台电脑确实不太方便。
电脑不一定随时在身边,但手机肯定有。单纯靠软件实现九宫格,却不可能让每个人在拿着手机的同时还揣着电脑。想到之前同事提供的一块树莓派,不如用它来做个文章。
树莓派九宫格服务器

step-1:树莓派装操作系统、搭编程环境——线多显得有些乱;
step-2:编写调试前后端代码;

step-3:运行web服务,用手机登录页面,从相册或文件夹里选图片即可。

其实也想过做App或微信小程序会更方便,但注册、资质、付费等问题暂时不考虑,关键还不会那玩意儿。用树莓派搭一个简单的Web服务器,后台提供切图功能,前端上传图片就能拿到九宫格结果,全家都能共享,省心不少。
