吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7874|回复: 297
收起左侧

[Windows] 自制的批量图片转ICO图标工具

    [复制链接]
52xiaosage 发表于 2024-11-24 02:06
本帖最后由 52xiaosage 于 2024-11-28 23:57 编辑

前几天因为需要ICO图标文件,在网上找半天,不是被限制转换就是要关注什么什么某众号,很是心烦,而且广告还一大把,于是就想着自己做一个,做到不求人,还能方便人,
于是乎就开始做了,结果在做的途中,PY界面都能正常运行,EXE打包硬是不行,折腾了整整一天,应是没有解决,现在这个问题都还挂在悬赏区,回头时间到了我去给他撤下来,后来询问了CHATGPT,大概意思就是我使用的有个功能需要用到拖拽的依赖库名字叫 tkdnd,说白了就是缺少个依赖库,算了不说了,总算解决了
这就是一个图片转ICO的工具,方便快捷绿色,而且它会根据目标场景自动选择适合的尺寸。

  • 程序会根据输入图片的尺寸生成多个不同尺寸的图标(从 16x16 到 256x256),但是保存的只有1个图标文件,但是这一个文件却包含了这几个大小尺寸版本同时的同时存在           
  • 自动选择尺寸:当你在不同的场景中使用该 ICO 文件时(比如桌面快捷方式、应用程序图标等),操作系统会根据需要自动选择合适的尺寸。如果系统需要显示一个小图标(例如 16x16),它会使用 16x16 的图标;如果需要更高分辨率的图标(例如 256x256),它会选择更大的尺寸。但是保存的只是一个ICO文件,自动选择
  • 软件使用截图

    软件使用截图

    软件使用截图


抱歉,抱歉,今天才发现,我发上来的是只能一次转一个文件,本来是做的批量转换的,结果发的时候发错版本了,又重新传了下,修复了单次只能转一个文件,现在可以批量转换了
并附上蓝奏更快:https://wwhg.lanzouj.com/ipWbg2gkqrna密码:52pj

免费评分

参与人数 68吾爱币 +56 热心值 +56 收起 理由
RHZSYQ + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qing124A + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dlksvo101 + 1 + 1 谢谢@Thanks!
shisoro + 1 谢谢@Thanks!
helh0275 + 1 + 1 感谢制作分享,但感觉工具是不是大了点啊~
gdygod + 1 我很赞同!
guoruihotel + 1 + 1 谢谢@Thanks!
Coolboy520 + 1 + 1 热心回复!
wxn153 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dzwindys + 1 + 1 谢谢@Thanks!
lbh22822 + 1 热心回复!
2024X + 1 + 1 谢谢@Thanks!
奇思多妙想 + 1 + 1 谢谢@Thanks!
hanyuan45 + 1 + 1 谢谢@Thanks!
SOFTWARE + 1 + 1 谢谢@Thanks!
huster + 1 谢谢@Thanks!
提着灯笼打酱油 + 1 + 1 谢谢@Thanks!
wenjinwu + 1 我很赞同!
ltzy19303 + 1 + 1 谢谢@Thanks!
ooodx + 1 + 1 谢谢@Thanks!
qdyb + 1 + 1 谢谢@Thanks!
ckloder + 1 + 1 谢谢@Thanks!
yxpp + 1 谢谢@Thanks!
feishibudong + 1 我很赞同!
aria1983 + 1 + 1 用心讨论,共获提升!
东门拉风 + 1 + 1 谢谢@Thanks!
老痰秋葵 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
战勇 + 1 + 1 谢谢@Thanks!
fuy56go + 1 + 1 我很赞同!
cxg863 + 1 + 1 谢谢@Thanks!
xuyongyong + 1 谢谢@Thanks!
st1118 + 1 + 1 谢谢@Thanks!
sunnyeast + 1 谢谢@Thanks!
a397555462 + 1 + 1 谢谢@Thanks!
kukuyu + 1 + 1 谢谢@Thanks!
wzlyq + 1 + 1 谢谢@Thanks!
wczsdwczsd + 1 我很赞同!
wq888 + 1 我很赞同!
zl87012295 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
nojon + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
无尘浪子 + 1 谢谢@Thanks!
hostclsecho + 1 + 1 我很赞同!
134wap + 1 + 1 谢谢@Thanks!
pbgz + 1 + 1 谢谢@Thanks!
2595453382 + 1 谢谢@Thanks!
guanxing54 + 1 + 1 我很赞同!
zhulingfenga + 1 + 1 我很赞同!
zhywapj96 + 1 我很赞同!
hw191111 + 1 谢谢@Thanks!
YYFC888 + 1 + 1 我很赞同!
lgh978 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
GY2024 + 1 我很赞同!
gml857 + 1 + 1 我很赞同!
zhangyu10031127 + 1 + 1 谢谢@Thanks!
mhaitao + 1 + 1 我很赞同!
砺心缘起 + 1 + 1 谢谢@Thanks!
MikoShiro + 1 我很赞同!
nmy124 + 1 谢谢@Thanks!
heiyi110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lmz320925 + 1 + 1 谢谢@Thanks!
spyu0312 + 1 + 1 谢谢@Thanks!
aps0432892 + 1 + 1 我很赞同!
Zed丶小灰狼 + 1 + 1 热心回复!
top808 + 1 + 1 谢谢@Thanks!
Qskaa + 1 方便多了
LuckyClover + 1 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
BTCQAQ + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

streamgo 发表于 2024-11-24 11:28
gjhlmy 发表于 2024-11-24 10:43
蓝奏链接:https://gjhlmy.lanzouj.com/i9nrm2g216ra

多谢多谢了,百度盘下不动。
 楼主| 52xiaosage 发表于 2024-11-24 15:16
本帖最后由 52xiaosage 于 2024-11-28 23:44 编辑

有很多伙伴需要源代码,本着互相学习,相互帮助,相互贡献,我把源码奉献出来
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, UnidentifiedImageError
import os
from tkinterdnd2 import TkinterDnD, DND_FILES
import threading

VALID_EXTENSIONS = (".png", ".jpg", ".jpeg", ".bmp")
ICO_SIZES = [(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]

class IconConverterApp:
    def __init__(self, root):
        self.root = root
        self.root.title("批量图片转换ICO工具")

        self.input_image_paths = []  # 存储多个图片文件路径
        self.success_files = []  # 成功转换的文件
        self.failed_files = []  # 失败的文件
        self.output_folder = None  # 默认输出文件夹为空

        # 创建界面组件
        self.description = tk.Label(root, text="将图片拖拽到窗口进行转换\n或点击区域选择图片", font=("Arial", 12))
        self.description.pack(padx=10, pady=10)

        # 输出路径提示
        self.info_frame = tk.Frame(root)
        self.info_frame.pack(padx=10, pady=5)

        self.info_label = tk.Label(self.info_frame, text="文件默认保存到源文件夹,若需要自定义保存位置,", font=("Arial", 10), fg="gray")
        self.info_label.pack(side="left")

        # 解决文字不整齐的问题,调整按钮
        self.output_button = tk.Button(self.info_frame, text="请点击更换保存位置", command=self.choose_output_folder, font=("Arial", 10, "bold"))
        self.output_button.pack(side="left", padx=5, pady=5)

        # 拖拽区域
        self.drag_area_button = tk.Label(root, text="拖拽图片文件到此区域或点击选择文件", width=50, height=10, relief="solid", bg="#d1c4e9", fg="blue", font=("Arial", 12))
        self.drag_area_button.pack(padx=10, pady=20)
        root.drop_target_register(DND_FILES)
        root.dnd_bind('<<Drop>>', self.on_drop)
        self.drag_area_button.bind("<Button-1>", self.choose_files)

        # 按钮区域
        button_frame = tk.Frame(root)
        button_frame.pack(pady=10)

        self.export_button = tk.Button(button_frame, text="立即转换", command=self.start_conversion, width=15, height=2, font=("Arial", 14, "bold"), bg="orange", fg="white")
        self.export_button.grid(row=0, column=1, padx=5)

    def on_drop(self, event):
        """处理拖放事件"""
        raw_paths = event.data.strip('{}').split('} {')
        self.input_image_paths = [os.path.normpath(path) for path in raw_paths if path.lower().endswith(VALID_EXTENSIONS)]
        if self.input_image_paths:
            self.drag_area_button.config(text=f"已拖拽 {len(self.input_image_paths)} 个文件")
        else:
            messagebox.showerror("错误", "仅支持图片文件类型!")

    def choose_files(self, event=None):
        """手动选择多个图片文件"""
        file_paths = filedialog.askopenfilenames(title="选择图片文件", filetypes=[("Image Files", "*.png;*.jpg;*.jpeg;*.bmp")])
        if file_paths:
            self.input_image_paths = list(file_paths)
            self.drag_area_button.config(text=f"已选择 {len(self.input_image_paths)} 个文件")

    def choose_output_folder(self):
        """选择输出文件夹"""
        folder = filedialog.askdirectory(title="选择输出文件夹")
        if folder:
            self.output_folder = folder
            self.output_button.config(text="输出文件夹已选择", bg="#90EE90")

    def convert_to_ico(self, input_image_path, output_ico_path):
        """根据图片尺寸生成 ICO 文件"""
        try:
            img = Image.open(input_image_path)
            valid_sizes = [(w, h) for w, h in ICO_SIZES if w <= img.width and h <= img.height]

            if not valid_sizes:
                return f"图片 {os.path.basename(input_image_path)} 尺寸太小,无法生成图标"

            img.save(output_ico_path, format='ICO', sizes=valid_sizes)
            return True
        except UnidentifiedImageError:
            return "无法识别的图片格式"
        except Exception as e:
            return str(e)

    def export_ico(self, input_image_path):
        """执行转换操作,单个文件的转换"""
        if not self.output_folder:
            self.output_folder = os.path.dirname(self.input_image_paths[0])  # 默认保存到第一个文件所在目录

        base_name = os.path.splitext(os.path.basename(input_image_path))[0]
        output_ico_path = os.path.join(self.output_folder, f"{base_name}.ico")

        if os.path.exists(output_ico_path):
            overwrite = messagebox.askyesno("覆盖确认", f"{output_ico_path} 已存在,是否覆盖?")
            if not overwrite:
                return

        result = self.convert_to_ico(input_image_path, output_ico_path)
        if result == True:
            self.success_files.append(f"{base_name}.ico")
        else:
            self.failed_files.append(f"{base_name}: {result}")

    def export_all_icos(self):
        """批量转换操作"""
        self.success_files.clear()
        self.failed_files.clear()

        for input_image_path in self.input_image_paths:
            self.export_ico(input_image_path)

        success_msg = f"成功转换的文件:\n" + "\n".join(self.success_files) if self.success_files else "没有文件成功转换。"
        failed_msg = f"\n失败的文件:\n" + "\n".join(self.failed_files) if self.failed_files else ""
        messagebox.showinfo("转换结果", success_msg + failed_msg)

    def start_conversion(self):
        """使用多线程避免界面卡顿"""
        thread = threading.Thread(target=self.export_all_icos)
        thread.start()


# 启动 GUI
root = TkinterDnD.Tk()
app = IconConverterApp(root)
root.mainloop()

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
rset + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

 楼主| 52xiaosage 发表于 2024-11-28 23:50
前面的不能批量转换,现在修复了2.0版,可批量转换
蓝奏https://wwhg.lanzouj.com/ipWbg2gkqrna
密码:52pj
noolds 发表于 2024-11-24 09:25
我有一个小想法,可以加入裁切吗?有的时候只想要一张大图中的一小部分当icon,或者是一张大图里面有很多张icon我只要一个
gjhlmy 发表于 2024-11-24 10:43
蓝奏链接:https://gjhlmy.lanzouj.com/i9nrm2g216ra

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
nojon + 1 + 1 谢谢@Thanks!
lin5414 + 1 + 1 谢谢@Thanks!
mogaga + 1 蓝奏使我快乐,度娘闹心

查看全部评分

StudyPavilion 发表于 2024-11-25 16:15
52xiaosage 发表于 2024-11-24 15:16
有很多伙伴需要源代码,本着互相学习,相互帮助,相互贡献,我把源码奉献出来
import tkinter as tk
from ...

感谢分享,待我有时间,写个美化版本
grayad 发表于 2024-11-24 02:12
好东西,我之前每次都是打开软媒魔方来改ico
yuzmb520 发表于 2024-11-24 02:23
好东西啊。感谢分享
jiajiahao952690 发表于 2024-11-24 02:35
好好学习,加油
wi_xue2008 发表于 2024-11-24 05:52
解决需要,谢谢分享,感谢!
notook 发表于 2024-11-24 06:00
谢谢大佬分享.
zfb38 发表于 2024-11-24 06:11
图标软件已经笑纳
skyward1987 发表于 2024-11-24 06:43
多谢分享
ddfzl 发表于 2024-11-24 06:52
这个有需要,感谢分享
Tll 发表于 2024-11-24 06:55
感谢楼主分享实用工具,正好能用上。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-28 18:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表