0

C# でアイコン イメージのハンドルを持っているとしましょう。コンテンツを有効な ICO ファイルとしてディスクに保存する方法はありますか? 私はすべてを試しましたが、運がありません。

私が考えた最初の解決策は、アイコン ハンドルに基づいて Bitmap オブジェクトを作成し、この Bitmap を ico としてファイルに保存することでした。問題は、.net の実装が機能せず、プレーンな PNG データしか出力しないことです。

次に、エンコーダーを自分で実装してみました。ICO コンテナーのヘッダーの説明に基づいて、これを実装し、魅力のように動作しますが、ペイロードとして png データを使用する場合のみです。

ビットマップデータを使用すると(これが必要です)、出力ファイルはOSによって有効な.icoファイルとして認識されません。

ビットマップ データを ICO コンテナーに書き込む方法に問題があることは 99% 確信しています。

記事に基づいて、ico ファイルの形式が PNG 画像の場合、PNG ヘッダーと一緒に書き込む必要があることがわかりました。ビットマップ イメージの場合は、ビットマップ ヘッダーなしでビットマップの生データのみを書き込む必要があります。

さて、私が試したのは、Bitmap オブジェクトの Lockbits() 関数を使用してビットマップ データ (バイト配列として) を取得し、ico ヘッダーの後に書き込み、ファイルを保存することです。私はヘッダーを正しく書いたと確信しています。しかし、私は何かが欠けていると思います。

ビットマップデータをicoファイルに書き込む正しい方法は何ですか?? また、HICON(C#ではINtPtr)ハンドルの内容をicoファイルに書き込む別の解決策があるのだろうか。

4

1 に答える 1

0

.icoファイルはビットマップ ファイルではありません (一部のプログラムはそれらを同じように扱いますが、ユーザーからの違いを隠しています)。

アイコン ファイルには ICO ヘッダーが含まれますが、アイコンの.ico各サブイメージのエントリを含む「ディレクトリ」も含まれます。次に、各サブイメージはビットマップ オブジェクトです (Win32 ビットマップ ヘッダーを使用しますが、Win32 ビットマップファイル ヘッダーは使用しません。紛らわしいです)。

icoCodePlex での処理を示すオープンソース コードがいくつかあります: http://anolis.codeplex.com/SourceControl/changeset/view/69709#930335 (Saveメソッドを見てください)。

于 2012-11-21T00:17:14.653 に答える