使用Python实现图片转ICO格式

 更新时间:2025年01月15日 09:21:32   作者:黑客白泽  
这篇文章主要为大家详细介绍了如何使用Python编写一个基于PyQt5的用于将图像文件转换为ICO格式GUI应用程序,感兴趣的小伙伴可以跟随小编一起学习一下

1. 简介

这个工具实现了一个基于PyQt5的用于将图像文件(如PNG、JPEG、BMP、GIF)转换为ICO格式GUI应用程序。以下是该工具的功能介绍:

UI布局:

  • 用于选择要转换的图像的文件输入。
  • 用于指定将生成的ICO文件保存在何处的输出路径输入。
  • 用于选择所需图标大小(16x16、32x32、48x48、64x64、128x128、256x256)的组合框。 转换前预览图像的区域。
  • “转换为ICO”按钮以执行转换。

转换过程:

  • 使用Python Pillow库(PIL)来处理图像操作。
  • 将所选图像转换为所需大小(以ICO文件的形式)。
  • 如果转换成功,转换将记录到文件(conversion_history.log)中。

拖放支持:

您可以将图像文件拖放到应用程序中,它将自动加载到输入字段中并带有预览。

错误处理:

对于丢失的文件或转换失败,会显示正确的错误消息。 如果有其他问题,可以评论区告诉我!

2. 运行效果

3. 相关源码

import sys
import os
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QFileDialog,
    QVBoxLayout, QHBoxLayout, QWidget, QMessageBox, QComboBox
)
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QMimeData
from PyQt5.QtGui import QDragEnterEvent, QDropEvent
from PIL import Image

# 日志文件
LOG_FILE = "conversion_history.log"

class ImageToICOConverter(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("图片转ICO工具")
        self.setGeometry(100, 100, 355, 360)
        self.setAcceptDrops(True)  # 启用拖拽功能
        self.initUI()

    def initUI(self):
        # 主布局
        main_layout = QVBoxLayout()

        # 图片选择
        file_layout = QHBoxLayout()
        self.image_path_input = QLineEdit(self)
        browse_button = QPushButton("浏览", self)
        browse_button.clicked.connect(self.choose_image_file)
        file_layout.addWidget(QLabel("选择图片文件:"))
        file_layout.addWidget(self.image_path_input)
        file_layout.addWidget(browse_button)
        main_layout.addLayout(file_layout)

        # 输出路径选择
        output_layout = QHBoxLayout()
        self.output_path_input = QLineEdit(self)
        save_button = QPushButton("保存", self)
        save_button.clicked.connect(self.choose_output_path)
        output_layout.addWidget(QLabel("选择输出路径:"))
        output_layout.addWidget(self.output_path_input)
        output_layout.addWidget(save_button)
        main_layout.addLayout(output_layout)

        # 图标尺寸选择(单选)
        size_layout = QHBoxLayout()
        self.size_combo = QComboBox(self)
        self.size_combo.addItems(["16", "32", "48", "64", "128", "256"])
        size_layout.addWidget(QLabel("选择图标尺寸:"))
        size_layout.addWidget(self.size_combo)
        main_layout.addLayout(size_layout)

        # 图片预览
        self.preview_label = QLabel("图片预览", self)
        self.preview_label.setAlignment(Qt.AlignCenter)
        self.preview_label.setStyleSheet("background-color: lightgray; border: 1px solid black;")
        self.preview_label.setFixedSize(200, 200)
        preview_layout = QVBoxLayout()
        preview_layout.addWidget(self.preview_label, alignment=Qt.AlignCenter)
        main_layout.addLayout(preview_layout)

        # 转换按钮
        convert_button = QPushButton("转换为ICO", self)
        convert_button.clicked.connect(self.convert_to_ico)
        main_layout.addWidget(convert_button, alignment=Qt.AlignCenter)

        # 设置中央窗口
        central_widget = QWidget()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)

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

    def choose_output_path(self):
        output_path, _ = QFileDialog.getSaveFileName(self, "选择输出路径", "", "ICO文件 (*.ico)")
        if output_path:
            self.output_path_input.setText(output_path)

    def show_preview(self, image_path):
        try:
            pixmap = QPixmap(image_path)
            pixmap = pixmap.scaled(200, 200, Qt.KeepAspectRatio, Qt.SmoothTransformation)
            self.preview_label.setPixmap(pixmap)
        except Exception as e:
            QMessageBox.critical(self, "预览错误", f"无法加载图片预览: {str(e)}")

    def convert_to_ico(self):
        image_path = self.image_path_input.text()
        output_path = self.output_path_input.text()

        if not image_path:
            QMessageBox.critical(self, "错误", "请选择源图片文件")
            return

        if not output_path:
            output_path = os.path.splitext(image_path)[0] + ".ico"
            self.output_path_input.setText(output_path)

        try:
            img = Image.open(image_path)

            # 获取用户选择的图标尺寸
            size = int(self.size_combo.currentText())
            sizes = [(size, size)]

            img = img.convert("RGBA")
            img.save(output_path, format="ICO", sizes=sizes)

            with open(LOG_FILE, "a") as log_file:
                log_file.write(f"Converted: {image_path} -> {output_path}\n")

            QMessageBox.information(self, "成功", f"图片已成功转换并保存为 {output_path}")
        except Exception as e:
            QMessageBox.critical(self, "转换错误", f"转换过程中发生错误: {str(e)}")

    def dragEnterEvent(self, event: QDragEnterEvent):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event: QDropEvent):
        mime_data: QMimeData = event.mimeData()
        if mime_data.hasUrls():
            file_path = mime_data.urls()[0].toLocalFile()
            self.image_path_input.setText(file_path)
            self.show_preview(file_path)

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

到此这篇关于使用Python实现图片转ICO格式的文章就介绍到这了,更多相关Python图片转ICO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python的爬虫框架 Scrapy

    详解Python的爬虫框架 Scrapy

    这篇文章主要介绍了Python的爬虫框架 Scrapy的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • python机器学习GCN图卷积神经网络原理解析

    python机器学习GCN图卷积神经网络原理解析

    这篇文章主要为大家介绍了GCN图卷积神经网络原理及代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python自动化测试之setUp与tearDown实例

    python自动化测试之setUp与tearDown实例

    这篇文章主要介绍了python自动化测试之setUp与tearDown实例,其中setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法,需要的朋友可以参考下
    2014-09-09
  • python编程开发时间序列calendar模块示例详解

    python编程开发时间序列calendar模块示例详解

    这篇文章主要为大家介绍了python编程开发时间序列calendar模块示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2021-11-11
  • 在matplotlib的图中设置中文标签的方法

    在matplotlib的图中设置中文标签的方法

    今天小编就为大家分享一篇在matplotlib的图中设置中文标签的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • TensorFlow用expand_dim()来增加维度的方法

    TensorFlow用expand_dim()来增加维度的方法

    今天小编就为大家分享一篇TensorFlow用expand_dim()来增加维度的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • pytorch如何对image和label同时进行随机翻转

    pytorch如何对image和label同时进行随机翻转

    这篇文章主要介绍了pytorch如何对image和label同时进行随机翻转问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python常见格式化字符串方法小结【百分号与format方法】

    Python常见格式化字符串方法小结【百分号与format方法】

    这篇文章主要介绍了Python常见格式化字符串方法,结合实例形式分析了百分号方法和format函数进行字符串格式化的具体使用技巧,需要的朋友可以参考下
    2016-09-09
  • Python过滤序列元素的方法

    Python过滤序列元素的方法

    这篇文章主要介绍了Python过滤序列元素的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 关于Python中两个不同shape的数组间运算规则

    关于Python中两个不同shape的数组间运算规则

    这篇文章主要介绍了关于Python中两个不同shape的数组间运算规则,众所周知,相同 shape 的两个数组间运算是指两个数组的对应元素相加,我们经常会碰到一些不同 shape 的数组间运算,需要的朋友可以参考下
    2023-08-08

最新评论