以前做过一个,我忘了,只是有点印象,懒得找,然后就直接又做了个新的,更直接,然后才找到了旧版。现在都分享出来
第一个版本,我叫它icon制作神器
我觉得短期内我的电脑应该不会再新增什么应用程序了,所以我的图标依然设置为最大

之前给chat box定制过一个icon,但是相比于因为伟大的icon就显得特别特别模糊,我一直都不满意。今天发现chaTBox也有Windows端,于是就下载回来了,n直接连原文件一起删掉了,以后再重新做新的
所以我们的第一个Python工具的核心功能就是双击点开,然后将要处理的PNG或者其他类型的图片拖进去,就变成256×256的icon文件,并直接删掉原文件
这样就非常适合我这种喜欢大图标的人使用了~
直接在PS中输入下面内容就可以将它装载到桌面啦~
# 1. 在桌面创建极简 GUI 面板程序~
$desktopPath = [Environment]::GetFolderPath("Desktop")
$pyScriptPath = Join-Path $desktopPath "Icon制作神器.pyw"
$code = @"
import sys
import os
import time
import threading
import subprocess
# 静默依赖检查与自动安装
def setup_dependencies():
needed = []
try:
from PIL import Image
except ImportError:
needed.append("pillow")
try:
from tkinterdnd2 import DND_FILES, TkinterDnD
except ImportError:
needed.append("tkinterdnd2")
if needed:
subprocess.check_call([sys.executable, "-m", "pip", "install"] + needed + ["-q"])
setup_dependencies()
import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image
from tkinterdnd2 import DND_FILES, TkinterDnD
class ConverterApp:
def __init__(self, root):
self.root = root
self.root.title("高清 ICO 转换器")
self.root.geometry("380x280")
self.root.resizable(False, False)
self.root.configure(bg="#F3F4F6")
# 居中显示窗口
self.root.update_idletasks()
width = self.root.winfo_width()
height = self.root.winfo_height()
x = (self.root.winfo_screenwidth() // 2) - (width // 2)
y = (self.root.winfo_screenheight() // 2) - (height // 2)
self.root.geometry(f'+{x}+{y}')
# 拖拽核心容器框 (圆角视效虚线框)
self.drop_frame = tk.Frame(self.root, bg="#FFFFFF", highlightbackground="#CBD5E1", highlightthickness=2, relief="flat")
self.drop_frame.pack(fill="both", expand=True, padx=20, pady=(20, 10))
# 提示标签
self.label_icon = tk.Label(self.drop_frame, text="🖼️", font=("Segoe UI Emoji", 32), bg="#FFFFFF", fg="#64748B")
self.label_icon.pack(pady=(30, 5))
self.label_title = tk.Label(self.drop_frame, text="拖拽图片到此处", font=("Microsoft YaHei", 12, "bold"), bg="#FFFFFF", fg="#1E293B")
self.label_title.pack(pady=2)
self.label_sub = tk.Label(self.drop_frame, text="会自动转换为 256×256 无损 ICO 并删除原图", font=("Microsoft YaHei", 8), bg="#FFFFFF", fg="#94A3B8")
self.label_sub.pack(pady=(0, 20))
# 底部进度条与状态显示
self.status_frame = tk.Frame(self.root, bg="#F3F4F6")
self.status_frame.pack(fill="x", padx=20, pady=(0, 15))
self.progress = ttk.Progressbar(self.status_frame, orient="horizontal", mode="determinate", length=340)
self.progress.pack(fill="x", pady=(0, 5))
self.status_label = tk.Label(self.status_frame, text="就绪", font=("Microsoft YaHei", 9), bg="#F3F4F6", fg="#64748B")
self.status_label.pack()
# 注册拖拽目标
self.drop_frame.drop_target_register(DND_FILES)
self.drop_frame.dnd_bind('<<Drop>>', self.on_drop)
def on_drop(self, event):
# 解析拖拽的文件路径 (兼容空格路径)
raw_files = self.root.tk.splitlist(event.data)
if not raw_files:
return
# 开启后台线程处理,防止 GUI 卡顿
threading.Thread(target=self.process_files, args=(raw_files,), daemon=True).start()
def process_files(self, files):
valid_exts = ('.png', '.jpg', '.jpeg', '.webp', '.bmp', '.tiff')
image_files = [f for f in files if os.path.splitext(f)[1].lower() in valid_exts]
if not image_files:
self.update_status("未发现有效图片格式喵!", 0, fg="#EF4444")
return
total = len(image_files)
for idx, file_path in enumerate(image_files, start=1):
file_name = os.path.basename(file_path)
self.update_status(f"正在处理 ({idx}/{total}): {file_name}", 10)
try:
# 模拟流畅动画效果
for p in range(10, 80, 15):
time.sleep(0.03)
self.update_status(f"正在处理: {file_name}", p)
img = Image.open(file_path).convert("RGBA")
target_size = (256, 256)
# 保持比例智能填充
img.thumbnail(target_size, Image.Resampling.LANCZOS)
new_img = Image.new("RGBA", target_size, (0, 0, 0, 0))
paste_pos = ((256 - img.width) // 2, (256 - img.height) // 2)
new_img.paste(img, paste_pos)
# 保存为 256x256 ICO
ico_path = os.path.splitext(file_path)[0] + ".ico"
new_img.save(ico_path, format="ICO", sizes=[(256, 256)])
img.close()
os.remove(file_path) # 删除原始文件
self.update_status(f"已完成: {file_name}", 100, fg="#10B981")
time.sleep(0.2)
except Exception as e:
self.update_status(f"处理失败: {file_name}", 0, fg="#EF4444")
time.sleep(0.5)
self.update_status(f"全部完成! 已无损生成 256×256 ICO 喵~", 100, fg="#10B981")
# 3秒后重置状态
self.root.after(3000, lambda: self.update_status("就绪", 0, fg="#64748B"))
def update_status(self, text, val, fg="#64748B"):
self.root.after(0, lambda: (
self.status_label.config(text=text, fg=fg),
self.progress.config(value=val)
))
if __name__ == "__main__":
root = TkinterDnD.Tk()
app = ConverterApp(root)
root.mainloop()
"@
[System.IO.File]::WriteAllText($pyScriptPath, $code, [System.Text.Encoding]::UTF8)
# 2. 生成桌面的快捷方式 (匹配 pythonw 无窗口模式)
$pythonExe = (Get-Command python -ErrorAction SilentlyContinue).Source
if (-not $pythonExe) {
Write-Host "错误: 未检测到 Python 环境喵!" -ForegroundColor Red
exit
}
$pythonwExe = Join-Path (Split-Path $pythonExe) "pythonw.exe"
if (-not (Test-Path $pythonwExe)) { $pythonwExe = $pythonExe }
$shortcutPath = Join-Path $desktopPath "Icon制作神器.lnk"
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($shortcutPath)
$Shortcut.TargetPath = $pythonwExe
$Shortcut.Arguments = "`"$pyScriptPath`""
$Shortcut.WindowStyle = 1
$Shortcut.Description = "256x256 高清 ICO 可视化转换面板"
$Shortcut.Save()
Write-Host "完美! 高清 ICO 可视化面板程序已在桌面生成完毕喵!" -ForegroundColor Green
第二个版本是老版本,应该也是哈基米做的 我起名叫化形
会处理出一套全套的分辨率的icon文件~并不会删除原图 同时,理论支持三种使用方式
这个版本理论上支持在你没有安装库的时候自动安装,并且自动重试 ^-^
依然在powershell中运行命令就可以了
# ==========================================
# 化形 · 部署一键脚本
# ==========================================
Clear-Host
$desktopPath = [Environment]::GetFolderPath("Desktop")
$pyScriptPath = Join-Path $desktopPath "化形.py"
# 生成纯正原版「化形.py」代码 (含运行库自主提示与自动重试逻辑)
$code = @"
"""
化形 · PNG → ICO 小工具
把 PNG 图凝成多分辨率 ICO(16/24/32/48/64/128/256)
Windows 每一级图标视图都能从里面取到最合适的那张,全程清晰
用法(任选其一,最推荐第 1 种):
1) 双击 化形.py → 弹出文件选择框 → 选 PNG 即可
2) 把 PNG 文件直接拖到 化形.py 的文件图标上(不是窗口里)
3) 命令行:python 化形.py <PNG路径> [输出路径]
"""
import sys
import os
import time
import subprocess
from pathlib import Path
# --- 运行库自主检测、告知提示与自动重试逻辑 ---
def ensure_pillow():
try:
from PIL import Image
except ImportError:
print("--------------------------------------------------")
print("⚠️ 提示: 检测到当前电脑未安装必要的图片处理库 Pillow!")
print("🛠️ 正在为你自动安装 Pillow,请稍候...")
print("--------------------------------------------------")
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", "pillow"])
print("\n✅ Pillow 安装完成! 正在自动开始重试...")
time.sleep(1.5)
# 安装完成后,自动拉起新进程重试运行
os.execv(sys.executable, [sys.executable] + sys.argv)
except Exception as e:
print("❌ 安装 Pillow 失败,请检查网络后重试。错误信息:", e)
input("\n按回车关闭...")
sys.exit(1)
ensure_pillow()
from PIL import Image
# 多分辨率打包:小/中/大/超大图标视图都能取到最匹配的那张
SIZES = [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]
def to_ico(png_path, ico_path=None):
png_path = Path(png_path)
ico_path = Path(ico_path) if ico_path else png_path.with_suffix('.ico')
img = Image.open(png_path).convert('RGBA')
w, h = img.size
# 非正方形原图:透明边填充成方形,避免 resize 时变形
if w != h:
side = max(w, h)
square = Image.new('RGBA', (side, side), (0, 0, 0, 0))
square.paste(img, ((side - w) // 2, (side - h) // 2))
img = square
# Pillow 会自动为每个 size 从原图降采样生成一份位图,打包进同一个 ico
img.save(ico_path, format='ICO', sizes=SIZES)
return ico_path
def pick_png():
from tkinter import Tk, filedialog
root = Tk()
root.withdraw()
root.attributes('-topmost', True) # 选择框浮在最上层,不被其他窗口盖住
path = filedialog.askopenfilename(
title='选一张 PNG 来化形',
filetypes=[('PNG 图片', '*.png'), ('所有图片', '*.png;*.jpg;*.jpeg;*.bmp;*.webp'), ('所有文件', '*.*')]
)
root.destroy()
return path
def main():
if len(sys.argv) >= 2:
png = Path(sys.argv[1])
else:
picked = pick_png()
if not picked:
print('没有选中文件,已退出')
return
png = Path(picked)
if not png.exists():
print(f'找不到文件:{png}')
return
out = sys.argv[2] if len(sys.argv) >= 3 else None
result = to_ico(png, out)
print(f'✓ 完成:{result}')
print(f' 内含分辨率:{", ".join(f"{w}x{h}" for w, h in SIZES)}')
if __name__ == '__main__':
try:
main()
finally:
input('\n按回车关闭...')
"@
[System.IO.File]::WriteAllText($pyScriptPath, $code, [System.Text.Encoding]::UTF8)
Write-Host "【化形.py】已生成在桌面喵!" -ForegroundColor Green
从凌晨3点上线,一直到现在,48分钟,本来想搞一搞我那个学习系统的,结果就因为chatbox出了个桌面端 给我硬控到现在 
实际上事情的起因也是我想要搞这个学习系统,那么就需要用我的loom工具,但是这个工具有一个我吐槽了几次的缺点,我打算让DSV4F改一改,所以我就得用chat box, 然后就有了上面的故事
总之今天依旧被迫摆烂,只能先去玩暖暖了
顺带一提。
第二个版本指令我并没有进行自主验证,可能会被哈基米哈气投毒 ^-^