使用python制作九宫格切图器

您所在的位置:网站首页 把一张图切割成九张图 使用python制作九宫格切图器

使用python制作九宫格切图器

2024-07-16 22:54| 来源: 网络整理| 查看: 265

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

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

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

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

 1. Pillow模块介绍

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

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

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

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

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

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

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

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

2. tkinter模块介绍

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

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

控件(Widgets):

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

几何管理器(Geometry Managers):

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

事件驱动编程:

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3