提取全解:讓W(xué)indows應(yīng)用在Linux桌面擁有原生質(zhì)感圖標(biāo)的3步實(shí)操)
WinApps圖標(biāo)提取全解讓W(xué)indows應(yīng)用在Linux桌面擁有原生質(zhì)感圖標(biāo)的3步實(shí)操【免費(fèi)下載鏈接】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/項(xiàng)目地址: https://gitcode.com/GitHub_Trending/wina/winappsWinApps讓Microsoft 365、Adobe這類(lèi)Windows應(yīng)用在Linux桌面上像本地程序一樣運(yùn)行。本文帶你拆解它從EXE文件中提取應(yīng)用圖標(biāo)的完整機(jī)制圖標(biāo)從哪來(lái)、怎么跨系統(tǒng)傳到Linux、哪幾個(gè)文件值得你翻一翻以及提取失敗時(shí)圖標(biāo)變成灰方塊該怎么救。 為什么需要它你在Linux上跑通WinApps后打開(kāi)應(yīng)用菜單看到的卻是一排默認(rèn)方塊圖標(biāo)——因?yàn)長(zhǎng)inux并不知道Windows里那些程序長(zhǎng)什么樣。WinApps的做法是讓W(xué)indows自己報(bào)戶口掃描已安裝的應(yīng)用程序把每個(gè)程序關(guān)聯(lián)的圖標(biāo)抓出來(lái)再為它在桌面上生成一個(gè)帶正確圖標(biāo)的.desktop快捷方式。于是一個(gè)EXE文件最終變成了應(yīng)用菜單里一個(gè)有名字、有圖標(biāo)、能點(diǎn)擊就啟動(dòng)的原生入口。?? 它到底怎么做的核心鏈路就三段跨了Windows和Linux兩個(gè)系統(tǒng)輸入Windows虛擬機(jī)里裝好的所有.exe文件來(lái)源包括Windows注冊(cè)表、UWP、Chocolatey、Scoop處理PowerShell腳本install/ExtractPrograms.ps1調(diào)用.NET的ExtractAssociatedIcon從每個(gè)EXE里讀出關(guān)聯(lián)圖標(biāo)轉(zhuǎn)成PNG后編碼為base64字符串連同應(yīng)用名、可執(zhí)行路徑一起打印成bash數(shù)組輸出setup.sh讀回這些數(shù)組把base64解碼成icon.png寫(xiě)入每個(gè)應(yīng)用自己的目錄并生成.desktop文件引用它。一個(gè)非直覺(jué)的設(shè)計(jì)為什么傳PNG而不是直接傳.ico因?yàn)镻NG跨平臺(tái)通用、Linux端解碼零依賴(lài)而base64文本能安全地塞進(jìn)bash數(shù)組隨RDP會(huì)話傳回像把圖片塞進(jìn)信封寄回來(lái)一樣。 從EXE到桌面圖標(biāo)的完整流程應(yīng)用發(fā)現(xiàn)ExtractPrograms.ps1在Windows側(cè)注冊(cè)表App Paths、UWP包、Chocolatey/Scoop的shim目錄里各掃一遍拿到應(yīng)用名和EXE路徑——因?yàn)檫@是圖標(biāo)提取的前提必須先知道有哪些程序。圖標(biāo)抽取對(duì)每個(gè)EXE調(diào)用ExtractAssociatedIcon取出關(guān)聯(lián)圖標(biāo)這是整個(gè)鏈路里唯一真正讀圖的環(huán)節(jié)。格式與編碼圖標(biāo)畫(huà)到Bitmap上以PNG格式寫(xiě)入內(nèi)存流再轉(zhuǎn)成base64——PNG保留色深base64保證能安全地以純文本形式跨越兩個(gè)操作系統(tǒng)。結(jié)果回傳所有結(jié)果以NAMES()、EXES()、ICONS()三組bash數(shù)組的形式寫(xiě)入~/.local/share/winapps/detected文件Linux端直接source它。解碼落盤(pán)setup.sh對(duì)每個(gè)選中的應(yīng)用執(zhí)行base64 -d把圖標(biāo)寫(xiě)成icon.png存到~/.local/share/winapps/apps/應(yīng)用名/下。生成快捷方式寫(xiě)入info文件應(yīng)用名、Windows內(nèi)EXE路徑、分類(lèi)再生成.desktop文件并指向該圖標(biāo)應(yīng)用菜單即刻可見(jiàn)。順帶一提社區(qū)已測(cè)試過(guò)的應(yīng)用如Word、Photoshop不走這套提取流程而是直接使用倉(cāng)庫(kù)apps/目錄下的預(yù)置高分辨率icon.svg畫(huà)質(zhì)明顯好于從EXE里抽的小圖標(biāo)。 文件與資源速查install/ExtractPrograms.ps1 — 圖標(biāo)提取的核心腳本GetApplicationIcon函數(shù)就是提取邏輯本體setup.sh — 安裝主腳本waConfigureDetectedApps和waConfigureApp負(fù)責(zé)解碼圖標(biāo)、生成.desktopapps/ — 社區(qū)測(cè)試應(yīng)用的預(yù)置目錄每個(gè)子文件夾含icon.svg和info配置docs/libvirt.md / docs/docker.md — 官方文檔兩種后端環(huán)境的搭建指南?? 圖標(biāo)提取失敗或圖標(biāo)丑陋的三種常見(jiàn)原因現(xiàn)象圖標(biāo)是灰白色32x32小方塊→ 原因ExtractAssociatedIcon提取失敗腳本走了內(nèi)置的通用PNG兜底 → 處理確認(rèn)該EXE在Windows里本身有圖標(biāo)若應(yīng)用屬于社區(qū)列表卻沒(méi)用上SVG檢查apps/下對(duì)應(yīng)目錄名是否拼寫(xiě)一致?,F(xiàn)象圖標(biāo)放大后發(fā)虛、有鋸齒→ 原因ExtractAssociatedIcon只取EXE內(nèi)嵌的默認(rèn)圖標(biāo)通常是32x32不會(huì)挑多尺寸ICO里的最大版本 → 處理對(duì)??吹膽?yīng)用手動(dòng)在~/.local/share/winapps/apps/應(yīng)用名/下?lián)Q成更大的PNG/SVG再重新跑一次安裝?,F(xiàn)象detected文件讀入后數(shù)組全空或解碼報(bào)錯(cuò)→ 原因文件由Windows寫(xiě)入行尾是\r\n而手工處理base64時(shí)混入的\r會(huì)讓解碼直接失敗setup.sh內(nèi)部已用sed處理過(guò) → 處理自己調(diào)試時(shí)先sed -i s/\r//g清一遍再source。 上手三步克隆并進(jìn)入倉(cāng)庫(kù)git clone https://gitcode.com/GitHub_Trending/wina/winapps后cd winapps按docs/libvirt.md或docs/docker.md準(zhǔn)備好一臺(tái)能跑RDP的Windows虛擬機(jī)/容器執(zhí)行./setup.sh按提示選擇安裝方式并勾選要配置的應(yīng)用驗(yàn)證標(biāo)準(zhǔn)跑完后打開(kāi)Linux應(yīng)用菜單或Nautilus右鍵打開(kāi)方式能看到Word、Photoshop等應(yīng)用的彩色圖標(biāo)且點(diǎn)擊即可啟動(dòng)即說(shuō)明圖標(biāo)鏈路已打通。 還能拿它做什么ExtractPrograms.ps1里的GetApplicationIcon函數(shù)幾乎不依賴(lài)WinApps本體你可以把它單獨(dú)拿出來(lái)作為批量從一批EXE文件里抽圖標(biāo)、轉(zhuǎn)PNG的工具用。另外source一個(gè)bash數(shù)組文件這種跨系統(tǒng)傳結(jié)構(gòu)化數(shù)據(jù)的手法在你自己寫(xiě)Windows-Linux混合自動(dòng)化腳本時(shí)也值得抄?!久赓M(fèi)下載鏈接】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/項(xiàng)目地址: https://gitcode.com/GitHub_Trending/wina/winapps創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考