基于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 bsddb模块操作Berkeley DB数据库介绍

    Python bsddb模块操作Berkeley DB数据库介绍

    这篇文章主要介绍了Python bsddb模块操作Berkeley DB数据库介绍,这里简单介绍一些关于bsddb的使用方法,需要的朋友可以参考下
    2015-04-04
  • Python 获取ftp服务器文件时间的方法

    Python 获取ftp服务器文件时间的方法

    今天小编就为大家分享一篇Python 获取ftp服务器文件时间的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python 装饰器常用的创建方式及源码示例解析

    Python 装饰器常用的创建方式及源码示例解析

    装饰器(decorator)是一种高级Python语法,可以对一个函数、方法或者类进行加工,这篇文章主要介绍了Python 装饰器常用的创建方式及解析,需要的朋友可以参考下
    2022-04-04
  • Python实现进度条和时间预估的示例代码

    Python实现进度条和时间预估的示例代码

    这篇文章主要介绍了Python实现进度条和时间预估的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Python实现数值交换的四种方式

    Python实现数值交换的四种方式

    本文介绍了Python中四种实现数值交换的方法,包括使用临时变量、元组解包、列表和异或运算,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Django中Middleware中的函数详解

    Django中Middleware中的函数详解

    这篇文章主要介绍了Django中Middleware中的函数详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python编程密码学文件加密与解密代码解析

    Python编程密码学文件加密与解密代码解析

    这篇文章主要为大家介绍了Python编程密码学文件加密与解密,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python实现提取JSON数据中的键值对并保存为.csv文件

    Python实现提取JSON数据中的键值对并保存为.csv文件

    这篇文章主要为大家详细介绍了如何基于Python实现读取JSON文件数据,并将JSON文件中指定的键值对数据转换为.csv格式文件,感兴趣的小伙伴可以了解下
    2023-09-09
  • 关于Django外键赋值问题详解

    关于Django外键赋值问题详解

    这段时间用django 做程序用到了一对多的关系的操作,下面分享一些心得体会,这篇文章主要给大家介绍了关于Django外键赋值问题的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Python 实现加密过的PDF文件转WORD格式

    Python 实现加密过的PDF文件转WORD格式

    这篇文章主要介绍了Python 实现加密过的PDF文件转WORD格式,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论