200字
【Python】九宫格图片生成器
2025-10-13
2025-10-14

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

image-Vwak.png

📖 项目简介

九宫格图片生成器是一个基于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. 使用方法

方法一:点击选择

  1. 点击"选择图片"按钮
  2. 在文件对话框中选择要分割的图片
  3. 程序自动显示分割后的九宫格预览

方法二:拖拽操作

  1. 直接将图片文件拖拽到应用窗口
  2. 程序自动识别并处理图片
  3. 实时显示分割效果

保存图片

  1. 分割完成后,"一键保存"按钮会自动启用
  2. 点击"一键保存"按钮
  3. 选择保存目录
  4. 程序自动创建文件夹并保存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 - 功能增强

  • 添加拖拽功能支持
  • 实现一键保存功能
  • 优化图片处理逻辑
  • 添加错误处理和用户提示

🚨 注意事项

  1. 图片格式:确保输入图片为支持的格式
  2. 图片尺寸:建议使用尺寸能被3整除的图片以获得最佳效果
  3. 保存路径:选择有写入权限的目录进行保存
  4. 内存使用:处理大尺寸图片时注意内存占用

🔮 未来规划

  • 支持自定义分割数量(如2x2、4x4等)
  • 添加图片预处理功能(旋转、缩放等)
  • 支持批量处理多张图片
  • 添加更多输出格式选项
  • 实现图片质量和压缩设置

📄 许可证

本项目采用MIT许可证,详情请参阅LICENSE文件。

🤝 贡献指南

欢迎提交Issue和Pull Request来改进这个项目!


作者:小庄-Python办公
创建时间:2025年10 月11日
技术栈:Python + PyQt5 + PIL
项目类型:桌面应用程序


【Python】九宫格图片生成器
作者
一晌小贪欢
发表于
2025-10-13
License
CC BY-NC-SA 4.0

评论