当前位置: 代码网 > it编程>前端脚本>Python > 基于Python实现一个图片拆分工具

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

2025年07月06日 Python 我要评论
简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过deepseek来输出文件名的格式。效果图完整代码import sysimport

简单介绍

先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过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图片拆分内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com