当前位置: 首页 > news >正文

使用Python实现ICO文件生成工具

使用Python实现ICO文件生成工具

ICO文件通常用于表示桌面图标,如应用程序图标、快捷方式图标等。开发者在开发Windows应用程序时,会使用ICO文件作为应用程序的图标。Windows应用程序会在窗口标题栏、任务栏或程序窗口的左上角显示一个图标,这些图标也通常是ICO格式。

允许用户选择一个图像文件并将其转换为ICO文件。

用户可以使用复选框选择不同的尺寸(如16x16、32x32、256x256)来生成ICO文件。

注意:原图像尺寸需大于等于所选ICO文件尺寸,否则自动跳过无法生成的尺寸。

生成的ICO文件文件和用户选择一个图像文件在同一个文件夹中。

运行效果图:

本程序需要使用 第三方pillow库(PIL库)。关于pillow(PIL)的安装使用介绍可见: https://blog.csdn.net/cnds123/article/details/126141838

源码:

import tkinter as tk
from tkinter import filedialog
from PIL import Image
import os

SUPPORTED_EXTENSIONS = ('.png', '.jpg', '.jpeg', '.gif', '.bmp')
DEFAULT_SIZES = [16, 32, 64, 128, 256]

def convert_images_to_ico(image_path, selected_sizes):
    if not os.path.exists(image_path):
        file_name = os.path.basename(image_path)
        result_label.config(text=f"错误:文件 {file_name} 不存在。")
        return

    if not any(image_path.lower().endswith(ext) for ext in SUPPORTED_EXTENSIONS):
        file_name = os.path.basename(image_path)
        result_label.config(text=f"错误:不支持 {file_name} 的格式。")
        return

    try:
        image = Image.open(image_path)
        success_sizes = []
        failed_sizes = []
        
        for size in selected_sizes:
            # 检查图像尺寸是否足够
            if image.width < size or image.height < size:
                failed_sizes.append(f"{size}x{size}")
                continue
            
            # 转换为RGBA模式以支持透明度
            img = image.convert("RGBA")
            
            # 调整图像尺寸
            resized_image = img.resize((size, size), Image.Resampling.LANCZOS)
            
            # 生成文件名
            base_name = os.path.splitext(os.path.basename(image_path))[0]
            ico_path = os.path.join(
                os.path.dirname(image_path),
                f"{base_name}_{size}x{size}.ico"
            )
            
            # 关键修改:强制使用PNG编码
            resized_image.save(
                ico_path,
                format="ICO",
                png=True  # 强制使用PNG格式编码
            )
            
            # 保存为单尺寸ICO文件
            resized_image.save(ico_path, format="ICO")
            success_sizes.append(f"{size}x{size}")

        # 生成结果报告
        report = []
        if success_sizes:
            report.append(f"成功生成 {len(success_sizes)} 个文件:{', '.join(success_sizes)}")
        if failed_sizes:
            report.append(f"跳过 {len(failed_sizes)} 个尺寸:{', '.join(failed_sizes)}(原图太小)")
        
        result_label.config(text="\n".join(report))
        convert_button.config(state=tk.DISABLED)
    except Exception as e:
        result_label.config(text=f"致命错误:{str(e)}")

def select_image_file():
    file_path = filedialog.askopenfilename(filetypes=[("图像文件", "*.png;*.jpg;*.jpeg;*.gif;*.bmp")])
    if file_path:
        file_entry.delete(0, tk.END)
        file_entry.insert(0, file_path)
        convert_button.config(state=tk.NORMAL)
        result_label.config(text="")  # 清除旧提示

def start_conversion():
    selected = [int(size.get()) for size in size_vars if size.get() != ""]
    if not selected:
        result_label.config(text="错误:请至少选择一个尺寸!")
        return
    convert_images_to_ico(file_entry.get(), sorted(selected))

# 创建GUI界面
root = tk.Tk()
root.title("多尺寸ICO生成工具")
root.geometry("500x400")
root.resizable(False, False)

# 文件选择组件
select_button = tk.Button(root, text="选择图像文件", command=select_image_file)
select_button.pack(pady=10)

file_entry = tk.Entry(root, width=55)
file_entry.pack(pady=5)

# 尺寸选择面板
size_frame = tk.LabelFrame(root, text="选择需要生成的尺寸(可多选)")
size_frame.pack(pady=10, padx=20, fill=tk.X)

size_vars = []
for i, size in enumerate(DEFAULT_SIZES):
    var = tk.StringVar()
    # 默认勾选256x256和32x32
    if size in [32, 256]:
        var.set(str(size))
    cb = tk.Checkbutton(
        size_frame,
        text=f"{size}x{size}",
        variable=var,
        onvalue=str(size),
        offvalue=""
    )
    cb.grid(row=i//3, column=i%3, sticky=tk.W, padx=5, pady=2)
    size_vars.append(var)

# 转换按钮
convert_button = tk.Button(root, text="生成多个ICO文件", command=start_conversion)
convert_button.pack(pady=15)

# 结果提示
result_label = tk.Label(root, text="", wraplength=450, justify="left")
result_label.pack()

root.mainloop()

打包发布

PyInstaller 是一个流行的 Python 打包工具,可以将 Python 应用程序及其依赖项打包成单个可执行文件(如 Windows 上的.exe 文件)。PyInstaller 的核心功能是将 Python 脚本及其依赖的模块和资源文件打包成一个独立的可执行文件。

对于非技术用户来说,运行一个独立的可执行文件比安装 Python 环境和依赖库要简单得多。

对于开发者来说,可以将程序打包成一个文件或一个目录,方便分发和部署。

官方文档 https://pyinstaller.org/en/stable/

关于pyinsatller安装使用可参见:

使用pyinsatller将python程序项目发布为可执行文件(修订版)https://blog.csdn.net/cnds123/article/details/115254418

为方便,我这里将本游戏命名为:图标生成工具.py ,将之复制到文件夹 “D:\图标生成”中。

打开命令行(终端)窗口,并导航到. py文件所在的目录,然后使用以下命令构建您的应用程序:

cd /d D:\图标生成

pyinstaller -F -w图标生成工具.py

-F或--onefile:将 Python 脚本及其所有依赖项打包成一个单独的可执行文件(例如 .exe 文件)。

使用 -w 或 --windowed 选项,你可以确保打包后的程序在运行时不显示控制台窗口,从而提供更干净的用户体验。

OK!

相关文章:

  • TensorFLow深度学习实战(11)——风格迁移详解
  • 电脑突然没有声音的可能原因与应对方法
  • NineData:解锁多云与混合云环境下的智能数据管理
  • 艾尔登复刻Ep1——客户端制作、场景切换、网络控制
  • Spring Boot 读取 ZooKeeper (ZK) 属性的总结指南
  • Lsposed模块原理详解
  • AI概率学预测足球大小球让球数据分析
  • 工作记录 2017-01-06
  • 支持向量机(SVM)原理与应用
  • Redis Sentinel 深度解析:构建高可用分布式缓存系统的核心机制
  • ActiveMQ监听器在MQ重启后不再监听问题
  • 用户可免费体验!国家超算互联网平台上线阿里开源推理模型接口服
  • Python网络爬虫之requests库的使用方法
  • 在虚拟机中部署kafka
  • AI 中对内存的庞大需求
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_04带选择框的固定表头表格
  • JavaScript_Day2
  • Xcode 16.2 最低部署版本调整
  • 卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现
  • 【isaacgym报错】安装isaacgym运行报错RuntimeError: Error building extension ‘gymtorch‘
  • 做网站流量的方法/柳市网站制作