我们都知道,九宫格切图器通常是非常实用且受欢迎的工具,特别是在社交媒体爱好者和内容创作者中。这类工具能够帮助用户快速将一张大图切割成多个小图块,以适应如微信朋友圈、微博等平台对于多图上传时呈现九宫格布局的需求,使得整体视觉效果更加吸引人
这些切图器一般具备以下特点:
这里将介绍一种用Python实现九宫格切图效果的方法,该方法来自明日科技出版的《Python实效编程百例》系列,这里仅供分享、交流学习用。?
九宫格切图器主要使用了Python第三方图像处理模块 Pillow,它是Python Imaging Library (PIL) 的一个活跃分支,专门为Python 3.x环境提供了全面的支持。Pillow的主要功能包括但不限于:
图像读取与写入:支持多种图像格式的读取和保存,如JPEG、PNG、BMP、GIF、TIFF、PPM、WebP等。
图像操作:可以对图像进行裁剪、缩放、旋转、翻转等基本几何变换,并且可以调整图像尺寸、颜色模式(如RGB到灰度)以及像素级的操作。
图像处理:提供滤镜和其他图像增强功能,如模糊、锐化、阈值处理、色彩平衡调整、色阶调整、直方图均衡化等。
图像创建与合成:可以从零开始创建新图像或使用绘图API绘制图形、文本等,并能够将多个图像合并为单个图像。
元数据处理:支持获取和修改图像的元数据信息,例如EXIF信息、IPTC标签等。
图像分块与像素遍历:允许以逐行或逐块的方式访问和操作图像像素,对于大数据量图像处理非常有用。
由于其易用性和广泛的功能集,Pillow在众多需要图像处理能力的Python项目中被广泛应用,例如网页爬虫抓取图片后的预处理、机器学习和深度学习中的数据预处理、图像识别系统的前端处理以及任何需要生成或修改图像的应用场景。
Python 的 tkinter 模块是 Python 标准库的一部分,它是一个用于创建图形用户界面(GUI)的工具包。Tkinter 是 Tcl/Tk 工具包的 Python 接口,Tcl/Tk 是一个跨平台的 GUI 开发框架,这意味着使用 Tkinter 编写的 GUI 应用程序可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。
?Tkinter 主要特点和功能简单介绍如下:
控件(Widgets):
几何管理器(Geometry Managers):
pack()
:通过简单的方向(水平或垂直)堆叠控件。grid()
:以表格形式排列控件,允许行列控制。place()
:直接指定控件的精确坐标位置。事件驱动编程:
导入相关模块。如果解释器中没有相关模块,使用pip命令安装即可。
# 1.导入相关模块
import tkinter as tk
import tkinter.filedialog
# 图像处理模块:Pillow(PIL)
from PIL import Image, ImageTk
# 2.定义填充图片的函数
# 将传入的图片填充为正方形,方便做后续的裁切
def fill_image(image):
width,height = image.size
# 比较图片的宽和高,选取值较大的作为新图的宽
new_Image_width = width if width > height else height
# 生成正方形图,空白处用白色填充
new_Image = Image.new(image.mode,(new_Image_width,new_Image_width),color='white')
if width > height:
new_Image.paste(image,(0,int((new_Image_width-height) / 2)))
else:
new_Image.paste(image,(int((new_Image_width-height) / 2),0))
return new_Image
# 3.定义切图函数将图片切成9块
def cut_image(image):
width,height = image.size
# 设置切图后每张图片宽度
colwidth = int(width/3)
image_grid = []
for i in range(0,3):
for j in range(0,3):
row = (j*colwidth,i*colwidth,(j+1)*colwidth,(i+1)*colwidth)
image_grid.append(row)
image_list = [image.crop(row) for row in image_grid]
return image_list
# 4.定义保存图片的函数,裁切完成后的9张图以'0.png'~'8.png'的方式命名
def save_images(image_list):
index = 0
for image in image_list:
image.save(str(index)+'.png','PNG')
index += 1
# 5.定义选择和预览图片的函数
# 单击"选择图片"按钮,预览要切分的图片
def select_button():
global a
a = tk.filedialog.askopenfilename()
# 预览图片
img = Image.open(a)
# 设置图片大小,缩放显示
out = img.resize((310,280))
img = ImageTk.PhotoImage(out)
label_image.config(image=img)
label_image.image = img
label_image.place(x=30,y=60)
# 显示图片文件路径
txt.set(a)
# 6.定义切图和保存图片的函数
# 单击"切分图片"按钮,调用切图和保存图片的函数
def cut_button():
file_path = a
# 加载原始图片
image = Image.open(file_path)
image_new = fill_image(image)
image_list = cut_image(image_new)
save_images(image_list)
# 打印提示信息
label1.config(text='切图成功!请在程序所在目录查看!')
# 设计GUI窗口界面:包含"选择图片"按钮和"切分图片"按钮
# 设置窗口
main = tk.Tk()
# 设置窗口的大小
main.geometry('400x400')
# 设置窗口标题栏
main.title('九宫格切图器')
# 设置窗口图标
main.iconbitmap('My pictures.ico')
# 显示提示信息
label1 = tk.Label(main,text='显示要切分图片的文件路径: ',fg='black')
label1.pack()
txt = tkinter.StringVar()
txt_entry = tkinter.Entry(main,width=55,textvariable=txt)
txt_entry.pack()
button1 = tk.Button(main,width=10,height=1,text='选择图片',fg='black',bg='white',command=select_button).place(x=30,y=360)
button2 = tk.Button(main,width=10,height=1,text='切分图片',fg='black',bg='white',command=cut_button).place(x=120,y=360)
# 添加显示图片的Label
label_image = tkinter.Label(main)
# 执行主循环
main.mainloop()
运行程序后,设计的GUI界面展示如下:
使用方法如下:
1.点击“选择图片”,在打开的文件夹中选择1张要裁切的图片;
2.加载图片完成后,点击“切分图片”,即可完成图片的裁切,在程序运行目录下显示切分后的'0.png'~'8.png'共9张图
3.如果要在程序中预览九宫格贴图的效果,可以运行以下代码:
import matplotlib.pyplot as plt
# 初始化一个3行3列的子图布局
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(10, 10))
# 遍历所有的子图和图片文件并显示图像
for i, ax in enumerate(axes.flat):
img = plt.imread(f'{i}.png') # 读取第i张图片
ax.imshow(img)
ax.set_axis_off() # 移除坐标轴
# 调整子图间距以防止重叠
plt.tight_layout()
# 显示图像窗口
plt.show()
4.这里运行的示例效果如下(〃'▽'〃):