本文主要是介绍基于Python实现一个图片拆分工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于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) China编程 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.clickejavascriptd.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 js* 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"- 原始图javascript片: {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实现一个图片拆分工具的文章就介绍到这了,更多相关PythoChina编程n图片拆分内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于基于Python实现一个图片拆分工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!