基于Python实现一个图片拆分工具

 更新时间:2025年07月06日 10:42:40   作者:封奚泽优  
这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下

简单介绍

先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过deepseek来输出文件名的格式。

效果图

完整代码 

import sys
import os
import shutil
from PIL import Image
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QLabel, QPushButton,
                             QVBoxLayout, QHBoxLayout, QFileDialog, QSpinBox, QGroupBox,
                             QMessageBox)
from PyQt5.QtCore import Qt


class ImageSplitterApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("图片拆分工具")
        self.setFixedSize(450, 400)  # 稍微增大窗口以适应更多内容

        # 获取项目目录作为默认输出路径
        self.project_dir = os.path.dirname(os.path.abspath(__file__))
        self.default_output_dir = os.path.join(self.project_dir, "split_results")
        self.output_dir = self.default_output_dir

        self.image_path = None
        self.original_filename = None

        self.init_ui()
        self.center_window()

    def center_window(self):
        """将窗口居中显示在屏幕上"""
        screen = QApplication.primaryScreen().geometry()
        size = self.geometry()
        self.move(
            (screen.width() - size.width()) // 2,
            (screen.height() - size.height()) // 2
        )

    def init_ui(self):
        # 主部件和布局
        main_widget = QWidget()
        main_layout = QVBoxLayout()
        main_layout.setAlignment(Qt.AlignTop)

        # 图片选择区域
        img_group = QGroupBox("图片选择")
        img_layout = QVBoxLayout()

        self.img_label = QLabel("未选择图片")
        self.img_label.setWordWrap(True)
        img_btn = QPushButton("选择图片")
        img_btn.clicked.connect(self.select_image)

        img_layout.addWidget(self.img_label)
        img_layout.addWidget(img_btn)
        img_group.setLayout(img_layout)

        # 拆分设置区域
        split_group = QGroupBox("拆分设置")
        split_layout = QHBoxLayout()

        row_layout = QVBoxLayout()
        row_label = QLabel("行数:")
        self.row_spin = QSpinBox()
        self.row_spin.setRange(1, 50)
        self.row_spin.setValue(2)
        row_layout.addWidget(row_label)
        row_layout.addWidget(self.row_spin)

        col_layout = QVBoxLayout()
        col_label = QLabel("列数:")
        self.col_spin = QSpinBox()
        self.col_spin.setRange(1, 50)
        self.col_spin.setValue(2)
        col_layout.addWidget(col_label)
        col_layout.addWidget(self.col_spin)

        split_layout.addLayout(row_layout)
        split_layout.addLayout(col_layout)
        split_group.setLayout(split_layout)

        # 输出信息区域
        output_group = QGroupBox("输出设置")
        output_layout = QVBoxLayout()

        self.output_label = QLabel(f"输出文件夹: {self.output_dir}")
        self.output_label.setWordWrap(True)

        output_btn = QPushButton("更改输出文件夹")
        output_btn.clicked.connect(self.select_output_dir)

        output_layout.addWidget(self.output_label)
        output_layout.addWidget(output_btn)
        output_group.setLayout(output_layout)

        # 操作按钮
        self.split_btn = QPushButton("拆分图片")
        self.split_btn.setEnabled(False)
        self.split_btn.clicked.connect(self.split_image)
        self.split_btn.setMinimumHeight(40)  # 增大按钮高度

        # 添加到主布局
        main_layout.addWidget(img_group)
        main_layout.addWidget(split_group)
        main_layout.addWidget(output_group)
        main_layout.addWidget(self.split_btn)

        main_widget.setLayout(main_layout)
        self.setCentralWidget(main_widget)

    def select_image(self):
        file_path, _ = QFileDialog.getOpenFileName(
            self, "选择图片", "",
            "图片文件 (*.png *.jpg *.jpeg *.bmp *.gif)"
        )

        if file_path:
            self.image_path = file_path
            self.original_filename = os.path.basename(file_path)
            display_text = f"已选择: {self.original_filename}"
            if len(display_text) > 40:
                display_text = f"已选择: ...{self.original_filename[-30:]}"
            self.img_label.setText(display_text)
            self.split_btn.setEnabled(True)

    def select_output_dir(self):
        dir_path = QFileDialog.getExistingDirectory(
            self, "选择输出文件夹",
            self.project_dir  # 从项目目录开始
        )

        if dir_path:
            self.output_dir = dir_path
            display_text = f"输出文件夹: {dir_path}"
            if len(display_text) > 60:
                display_text = f"输出文件夹: ...{dir_path[-50:]}"
            self.output_label.setText(display_text)

    def split_image(self):
        if not self.image_path:
            QMessageBox.warning(self, "警告", "请先选择图片!")
            return

        try:
            rows = self.row_spin.value()
            cols = self.col_spin.value()

            img = Image.open(self.image_path)
            img_width, img_height = img.size

            # 计算每个子图的大小
            tile_width = img_width // cols
            tile_height = img_height // rows

            # 确保输出目录存在
            os.makedirs(self.output_dir, exist_ok=True)

            # 复制原始图片到输出目录
            original_output_path = os.path.join(self.output_dir, self.original_filename)
            shutil.copy(self.image_path, original_output_path)

            # 拆分图片并保存为 main_数字.png
            count = 1
            for i in range(rows):
                for j in range(cols):
                    left = j * tile_width
                    upper = i * tile_height
                    right = left + tile_width
                    lower = upper + tile_height

                    # 确保最后一块包含剩余部分
                    if j == cols - 1:
                        right = img_width
                    if i == rows - 1:
                        lower = img_height

                    tile = img.crop((left, upper, right, lower))

                    # 生成文件名:main_数字.png
                    output_path = os.path.join(self.output_dir, f"main_{count}.png")
                    tile.save(output_path)
                    count += 1

            QMessageBox.information(
                self, "完成",
                f"图片已拆分为 {rows}×{cols} = {count - 1} 个小图!\n"
                f"保存到: {self.output_dir}\n\n"
                f"包含文件:\n"
                f"- 原始图片: {self.original_filename}\n"
                f"- 拆分图片: main_1.png 到 main_{count - 1}.png"
            )
        except Exception as e:
            QMessageBox.critical(self, "错误", f"处理图片时出错:\n{str(e)}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ImageSplitterApp()
    window.show()
    sys.exit(app.exec_())

结果如下 

到此这篇关于基于Python实现一个图片拆分工具的文章就介绍到这了,更多相关Python图片拆分内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 制作查询商品历史价格的小工具

    Python 制作查询商品历史价格的小工具

    这篇文章主要介绍了Python 如何制作查询商品历史价格的小工具,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10
  • django 环境变量配置过程详解

    django 环境变量配置过程详解

    这篇文章主要介绍了django 环境变量配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python非单一.py文件用Pyinstaller打包发布成exe

    python非单一.py文件用Pyinstaller打包发布成exe

    第一次将自己做的python爬虫项目打包成exe,所以留个笔记,本文详细的介绍了python非单一.py文件用Pyinstaller打包发布成exe,具有一定的参考价值,感兴趣的可以了解一下
    2022-03-03
  • python opencv实现图像矫正功能

    python opencv实现图像矫正功能

    这篇文章主要为大家详细介绍了python opencv实现图像矫正功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用python采集Excel表中某一格数据

    使用python采集Excel表中某一格数据

    这篇文章主要介绍了使用python采集Excel表中某一格数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python多进程和多线程究竟谁更快(详解)

    python多进程和多线程究竟谁更快(详解)

    下面小编就为大家带来一篇python多进程和多线程究竟谁更快(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 查看django版本的方法分享

    查看django版本的方法分享

    今天小编就为大家分享一篇查看django版本的方法分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python持久性管理pickle模块详细介绍

    python持久性管理pickle模块详细介绍

    这篇文章主要介绍了python持久性管理pickle模块详细介绍,本文讲解了什么是持久性、一些经过 pickle 的 Python等内容,并讲给出了18个使用示例,需要的朋友可以参考下
    2015-02-02
  • 解决Python 命令行执行脚本时,提示导入的包找不到的问题

    解决Python 命令行执行脚本时,提示导入的包找不到的问题

    今天小编就为大家分享一篇解决Python 命令行执行脚本时,提示导入的包找不到的问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2019-01-01
  • python机器学习pytorch自定义数据加载器

    python机器学习pytorch自定义数据加载器

    这篇文章主要为大家介绍了python机器学习pytorch自定义数据加载器使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论