九宫格图片生成器 - PyQt5桌面应用开发实战

📖 项目简介
九宫格图片生成器是一个基于PyQt5开发的桌面应用程序,可以将任意图片自动分割成3x3的九宫格格式。该应用支持拖拽操作和一键保存功能,为用户提供了便捷的图片处理体验。
项目源代码
Github:IKUN2788/Nine-grid-images: 图片生成九宫格,可一键保存)
打包下载:Python实现图片九宫格生成器资源
🎯 功能特性
核心功能
- 图片分割:自动将图片分割成3x3九宫格
- 拖拽支持:支持直接拖拽图片文件到应用窗口
- 一键保存:批量保存分割后的9张图片
- 多格式支持:支持PNG、JPG、JPEG、BMP、XMP等常见图片格式
- 智能命名:自动生成带时间戳的文件夹和规范的文件名
界面特色
- 网格布局:采用3x3网格布局直观显示分割效果
- 实时预览:分割后立即显示预览效果
- 状态反馈:提供详细的操作提示和错误信息
- 紧凑设计:优化的界面布局,避免窗口过长问题
🛠️ 技术栈
- GUI框架:PyQt5
- 图像处理:PIL (Python Imaging Library)
- 编程语言:Python 3.x
- 开发环境:支持Windows、macOS、Linux
📦 依赖安装
pip install PyQt5 Pillow
🚀 快速开始
1. 运行程序
python 图片九宫格生成器.py
2. 使用方法
方法一:点击选择
- 点击"选择图片"按钮
- 在文件对话框中选择要分割的图片
- 程序自动显示分割后的九宫格预览
方法二:拖拽操作
- 直接将图片文件拖拽到应用窗口
- 程序自动识别并处理图片
- 实时显示分割效果
保存图片
- 分割完成后,"一键保存"按钮会自动启用
- 点击"一键保存"按钮
- 选择保存目录
- 程序自动创建文件夹并保存9张图片
💻 核心代码解析
主窗口类设计
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("9宫格图片生成器")
self.setGeometry(100, 100, 700, 800)
# 存储分割后的图片数据
self.cropped_images = []
self.current_image_name = ""
# 启用拖拽功能
self.setAcceptDrops(True)
拖拽功能实现
def dragEnterEvent(self, event):
"""处理拖拽进入事件"""
if event.mimeData().hasUrls():
urls = event.mimeData().urls()
if len(urls) == 1:
file_path = urls[0].toLocalFile()
if file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.xmp')):
event.accept()
return
event.ignore()
def dropEvent(self, event):
"""处理拖拽放下事件"""
if event.mimeData().hasUrls():
urls = event.mimeData().urls()
if len(urls) == 1:
file_path = urls[0].toLocalFile()
if file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.xmp')):
self.split_image(file_path)
event.accept()
return
event.ignore()
图片分割算法
def split_image(self, image_path):
try:
img = Image.open(image_path)
width, height = img.size
new_width = width // 3
new_height = height // 3
# 清空之前的图片数据
self.cropped_images = []
# 获取图片文件名(不含扩展名)
self.current_image_name = os.path.splitext(os.path.basename(image_path))[0]
for i in range(3):
for j in range(3):
left = j * new_width
upper = i * new_height
right = (j + 1) * new_width
lower = (i + 1) * new_height
cropped_img = img.crop((left, upper, right, lower))
# 保存到内存中而不是临时文件
self.cropped_images.append(cropped_img.copy())
# 创建临时文件用于显示
temp_path = f"temp_{i}_{j}.png"
cropped_img.save(temp_path)
pixmap = QPixmap(temp_path)
self.labels[i * 3 + j].setPixmap(pixmap.scaled(200, 200))
# 删除临时文件
os.remove(temp_path)
# 启用保存按钮
self.save_button.setEnabled(True)
except Exception as e:
QMessageBox.warning(self, "错误", f"无法处理图片: {str(e)}")
智能保存功能
def save_images(self):
"""保存分割后的图片"""
if not self.cropped_images:
QMessageBox.warning(self, "警告", "没有可保存的图片")
return
# 选择保存目录
save_dir = QFileDialog.getExistingDirectory(self, "选择保存目录")
if not save_dir:
return
try:
# 创建时间戳文件夹
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
folder_name = f"{self.current_image_name}_{timestamp}"
full_save_path = os.path.join(save_dir, folder_name)
os.makedirs(full_save_path, exist_ok=True)
# 保存9张图片
for i in range(3):
for j in range(3):
index = i * 3 + j
filename = f"{self.current_image_name}_{i+1}_{j+1}.png"
filepath = os.path.join(full_save_path, filename)
self.cropped_images[index].save(filepath)
QMessageBox.information(self, "成功", f"图片已保存到:\n{full_save_path}")
except Exception as e:
QMessageBox.critical(self, "错误", f"保存失败: {str(e)}")
🎨 界面设计亮点
1. 网格布局优化
- 使用
QGridLayout替代QVBoxLayout - 避免了垂直排列导致的界面过长问题
- 3x3网格直观展示分割效果
2. 按钮布局改进
- 采用水平布局(
QHBoxLayout)排列按钮 - "选择图片"和"一键保存"按钮并排显示
- 保存按钮智能启用/禁用状态管理
3. 视觉效果增强
- 为图片标签添加边框样式
- 统一的图片尺寸(200x200)
- 清晰的九宫格结构展示
📁 文件结构
九宫格图片生成器/
├── 图片九宫格生成器.py # 主程序文件
├── 九宫格图片生成器博客.md # 项目文档
└── README.md # 使用说明
🔧 开发过程
版本1.0 - 基础功能
- 实现基本的图片选择和分割功能
- 使用垂直布局显示分割结果
- 临时文件方式处理图片
版本2.0 - 界面优化
- 改进为3x3网格布局
- 解决界面过长问题
- 优化窗口尺寸和布局
版本3.0 - 功能增强
- 添加拖拽功能支持
- 实现一键保存功能
- 优化图片处理逻辑
- 添加错误处理和用户提示
🚨 注意事项
- 图片格式:确保输入图片为支持的格式
- 图片尺寸:建议使用尺寸能被3整除的图片以获得最佳效果
- 保存路径:选择有写入权限的目录进行保存
- 内存使用:处理大尺寸图片时注意内存占用
🔮 未来规划
- 支持自定义分割数量(如2x2、4x4等)
- 添加图片预处理功能(旋转、缩放等)
- 支持批量处理多张图片
- 添加更多输出格式选项
- 实现图片质量和压缩设置
📄 许可证
本项目采用MIT许可证,详情请参阅LICENSE文件。
🤝 贡献指南
欢迎提交Issue和Pull Request来改进这个项目!
作者:小庄-Python办公
创建时间:2025年10 月11日
技术栈:Python + PyQt5 + PIL
项目类型:桌面应用程序