WinApps 图标提取:如何从 EXE 里取出清晰的应用图标
【免费下载链接】winappsRun Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration. Hard fork of https://github.com/Fmstrat/winapps/项目地址: https://gitcode.com/GitHub_Trending/wina/winapps
WinApps 让你把 Office、Adobe 这类软件装进一台 Linux 虚拟机或容器里的 Windows,再当成桌面原生应用来启动。但决定它"像不像原生"的,往往是启动器上那颗图标。这篇文章带你拆解 WinApps 图标提取的完整链路:它如何从 EXE 里把图标读出来、存到哪里,以及你在 Linux 上运行 Windows 应用时,四步就能拿到全部应用图标。
为什么 Linux 桌面需要 Windows 应用的图标
没有图标,你就得靠一堆灰色占位图去辨认 Word、Photoshop,放大还糊,用几次就想删掉这些"外来"应用。WinApps 的思路很直接:把 EXE 里本来就有的图标抠出来,贴到 Linux 启动项上,让它们和本机软件长得一样。需要说明的是,你的 Windows 软件实际跑在一台虚拟机里,比如 QEMU/KVM 中名为 RDPWindows 的那扇窗口。
它如何找到已安装的 Windows 应用
WinApps 靠四个来源把"装了哪些应用"摸出来:读 Windows 注册表里的 App Paths 键拿到已注册的可执行文件;扫描 Chocolatey 的 shims 目录(C:\ProgramData\chocolatey\bin);扫描 Scoop 的 shims 目录(~/scoop/shims);用 Get-AppxPackage 列出非系统的 UWP 应用。每一条命中都带上应用名和 EXE 路径,来源若不是注册表,还会在名字后标注来源,方便你在 Linux 端区分。
从 EXE 到 PNG 的提取流程
核心在 install/ExtractPrograms.ps1 里,每个 EXE 走三步:
- 用 System.Drawing.Icon.ExtractAssociatedIcon 读出该 EXE 的关联图标;
- 把图标画到一张位图上,按 PNG 格式存进内存流,保留原始分辨率和色彩深度;
- 把 PNG 字节编码成 base64 字符串,交给 Linux 端读取。
如果某一步失败,脚本会退回一张通用的 32×32 占位 PNG,保证启动器不空着。
提取出的图标放在哪里
这里有两套并存的图标,别搞混。一套是预置的:社区验证过的应用,仓库里 apps/ 下每个子文件夹都放了一张高分辨率 icon.svg(比如 apps/word/icon.svg),是矢量图,放大不糊。另一套是动态的:对没预置的应用,脚本现场从 EXE 提取出的 base64 PNG 会被缓存进本地一个 detected 文件,下次就不用重新提取。前者负责"好看",后者负责"全"。
上手体验:四步拿到全部应用图标
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/wina/winapps - 把 Windows 装进虚拟机或容器(libvirt / Docker / Podman 都行);
- 跑 setup.sh,按菜单选择"当前用户"还是"系统"安装;
- 脚本自动扫描并提取所有应用的图标。
进阶玩法:把提取当独立工具用
这套逻辑不挑 WinApps,你也可以单独拿来用:对一批 EXE 批量提取应用图标,一次拿全;把 Windows 图标统一转成 PNG,方便跨平台复用;或给你的自研启动器、应用中心配上一套清晰图标。读懂 install/ExtractPrograms.ps1 里的 GetApplicationIcon 函数,就是起点。
这样,一个"从 EXE 提取图标"的小脚本,就成了 Linux 上让 Windows 应用"长得像原生"的关键一环。
【免费下载链接】winappsRun Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration. Hard fork of https://github.com/Fmstrat/winapps/项目地址: https://gitcode.com/GitHub_Trending/wina/winapps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考