2012-11-20 64 views
0

讓我們只是說在C#中有一個圖標圖像的句柄。有沒有辦法將內容保存爲磁盤上的有效ICO文件?我嘗試了一切,但沒有運氣。將ICO文件寫入具有圖標的句柄的磁盤

我認爲的第一個解決方案是創建一個基於圖標句柄的位圖對象,然後將該位圖保存爲文件ico。問題是.net的實現不起作用,只輸出普通的PNG數據。

然後我試着自己實現編碼器。基於ICO容器的標題描述,我實現了這一點,並且像一個魅力一樣工作,但只有當我使用png數據作爲有效負載時。

如果我使用位圖數據(這是需要的)輸出文件不會被操作系統識別爲有效的.ico文件。

我99%確定問題是我將位圖數據寫入ICO容器的方式。

根據一篇文章,我發現當ico文件中的格式是PNG圖像時,它必須和PNG頭一起寫入。如果它是位圖圖像,則只能寫入位圖原始數據而不顯示位圖標頭。

那麼,我嘗試的是使用位圖對象的Lockbits()函數獲取位圖數據(作爲字節數組),然後寫入,在ico頭之後,並保存該文件。我確信我已經正確寫入了標題。但我認爲我錯過了一些東西,否則

將位圖數據寫入ico文件的正確方法是什麼? 此外,我想知道是否有另一種解決方案來將HICON(INPPTR in C#)的內容寫入ico文件。

+1

我已編輯您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

你必須調用GetIconInfoEx()。從數據中寫入文件沒有什麼快樂,也沒有png的支持。這通常只有一種方式,文件圖標。 –

回答

0

.ico文件不是位圖文件(某些程序對待它們相同,但它們掩蓋了與用戶的差異)。

.ico圖標文件包含ICO標題,還包含一個包含圖標每個子圖像條目的「目錄」。然後,每個子圖像是一個位圖對象(Win32位圖標頭,但不是Win32位圖文件標頭,是的,它很混亂)。

有一些開源代碼演示ico在CodePlex上的處理:http://anolis.codeplex.com/SourceControl/changeset/view/69709#930335(請參閱Save方法)。