使用python制作九宫格切图器

发布时间:2024年01月18日

我们都知道,九宫格切图器通常是非常实用且受欢迎的工具,特别是在社交媒体爱好者和内容创作者中。这类工具能够帮助用户快速将一张大图切割成多个小图块,以适应如微信朋友圈、微博等平台对于多图上传时呈现九宫格布局的需求,使得整体视觉效果更加吸引人

这些切图器一般具备以下特点:

  1. 操作简单:用户只需上传图片,工具会自动按照预设的九宫格或其他模板进行切割。
  2. 自定义设置:部分高级工具还允许用户调整切割的形状、边框样式、添加特效等个性化选项。
  3. 便捷分享:切割完成后可以直接保存到手机相册或一键分享至社交平台。

这里将介绍一种用Python实现九宫格切图效果的方法,该方法来自明日科技出版的《Python实效编程百例》系列,这里仅供分享、交流学习用。?

?1. Pillow模块介绍

九宫格切图器主要使用了Python第三方图像处理模块 Pillow,它是Python Imaging Library (PIL) 的一个活跃分支,专门为Python 3.x环境提供了全面的支持。Pillow的主要功能包括但不限于:

  1. 图像读取与写入:支持多种图像格式的读取和保存,如JPEG、PNG、BMP、GIF、TIFF、PPM、WebP等。

  2. 图像操作:可以对图像进行裁剪、缩放、旋转、翻转等基本几何变换,并且可以调整图像尺寸、颜色模式(如RGB到灰度)以及像素级的操作。

  3. 图像处理:提供滤镜和其他图像增强功能,如模糊、锐化、阈值处理、色彩平衡调整、色阶调整、直方图均衡化等。

  4. 图像创建与合成:可以从零开始创建新图像或使用绘图API绘制图形、文本等,并能够将多个图像合并为单个图像。

  5. 元数据处理:支持获取和修改图像的元数据信息,例如EXIF信息、IPTC标签等。

  6. 图像分块与像素遍历:允许以逐行或逐块的方式访问和操作图像像素,对于大数据量图像处理非常有用。

由于其易用性和广泛的功能集,Pillow在众多需要图像处理能力的Python项目中被广泛应用,例如网页爬虫抓取图片后的预处理、机器学习和深度学习中的数据预处理、图像识别系统的前端处理以及任何需要生成或修改图像的应用场景。

2. tkinter模块介绍

Python 的 tkinter 模块是 Python 标准库的一部分,它是一个用于创建图形用户界面(GUI)的工具包。Tkinter 是 Tcl/Tk 工具包的 Python 接口,Tcl/Tk 是一个跨平台的 GUI 开发框架,这意味着使用 Tkinter 编写的 GUI 应用程序可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。

?Tkinter 主要特点和功能简单介绍如下:

  1. 控件(Widgets)

    • Tkinter 提供了一系列丰富的 GUI 控件,如按钮(Button)、标签(Label)、文本框(Entry)、列表框(Listbox)、滚动条(Scrollbar)、复选框(Checkbutton)、单选按钮(Radiobutton)、菜单(Menu)、框架(Frame)等,开发者可以利用这些控件构建复杂的用户界面。
  2. 几何管理器(Geometry Managers)

    • 有三种布局管理器来帮助组织控件在窗口中的布局:
      • pack():通过简单的方向(水平或垂直)堆叠控件。
      • grid():以表格形式排列控件,允许行列控制。
      • place():直接指定控件的精确坐标位置。
  3. 事件驱动编程

    • Tkinter 支持事件驱动编程模型,可以为各个控件绑定各种事件(如鼠标点击、键盘按键、窗口大小改变等),并定义相应的回调函数来处理这些事件。

?3. 代码实现

1.准备动作

导入相关模块。如果解释器中没有相关模块,使用pip命令安装即可。

# 1.导入相关模块
import tkinter as tk
import tkinter.filedialog
# 图像处理模块:Pillow(PIL)
from PIL import Image, ImageTk

2.图片处理部分

# 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

3.定义GUI界面使用的功能函数

# 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='切图成功!请在程序所在目录查看!')

4.主程序部分:使用tkinter模块编辑GUI界面?

# 设计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()

?4. 效果展示

运行程序后,设计的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.这里运行的示例效果如下(〃'▽'〃):

文章来源:https://blog.csdn.net/qq_42533357/article/details/135643733
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。