Image: アイコンリソースの最適化と実行ファイルサイズの削減 [VC#]

実行ファイル(*.exe)のリソース等に埋め込むアイコンデータやその使用方法を工夫して、実行ファイルのファイルサイズを抑える手法。ついでにWindows上でのアイコンの使用例も調べてみた。

通常、アイコンファイル(*.ico)はいくつかのイメージタイプ(色数・サイズ)ごとに作成された複数のBMP(またはPNG)形式ファイルで構成されている。これを何も考えずにそのままリソース(実行ファイル)に組み込むと、ファイルサイズが非常に大きくなってしまう。
アイコンの用途や動作対象のWindowsバージョンを考慮に入れて、必要なイメージタイプのアイコンのみをリソースとして組み込むべきだろう。

まずはアイコンの各種イメージタイプがWindows上でどのように使われるのか見てみる。

○Windowsバージョン別のイメージタイプ対応表

各種形式 Win98 WinXP WinVista
16x16ドット O O O
20x20ドット X X (O)
24x24ドット X O O
32x32ドット O O O
40x40ドット X X (O)
48x48ドット O O O
64x64ドット X X (O)
96x96ドット X X (O)
128x128ドット X X (O)
256x256ドット X X O
1ビット(モノクロ) O O O
4ビット(16色) O O O
8ビット(256色) O O O
24ビット(RGB) X O O
32ビット(RGBA) X O O
BMP形式 O O O
PNG形式 X X O
  • アイコンイメージの色深度(色数)は1ビット(モノクロ)、4ビット(16色)、8ビット(256色)、24ビット(1677万色)、32ビット(1677万色+アルファチャンネル(透過情報))。
  • Windows 98において、非対応イメージタイプを含むアイコンファイルはエクスプローラー上で正しく表示されない。実行ファイルのアイコンは対応するイメージタイプが含まれていれば問題なく表示される。
  • Windows XPにおいては、非対応イメージタイプを含んでいてもBMP形式であればアイコンファイルは正しく表示される。PNG形式のイメージタイプのみのアイコンファイルは正しく表示されない。
  • Windows Vista以降ではアルファチャンネル(32ビット)を含むBMP形式およびPNG形式に対応している。20x20ドット、40x40ドット、64x64ドット、96x96ドット、128x128ドットのアイコンは、画面のDPI設定を変更した場合に使われる(のだと思う)。

Windows Vista(以降)における標準的なアイコンフォーマット

/ 16x16ドット 24x24ドット 32x32ドット 48x48ドット 256x256ドット
4ビット 16x16/16C 24x24/16C 32x32/16C 48x48/16C .
8ビット 16x16/256C 24x24/256C 32x32/256C 48x48/256C .
32ビット 16x16/RGBA 24x24/RGBA 32x32/RGBA 48x48/RGBA 256x256/RGBA

最低限、16x16、32x32、48x48、256x256ドットで各8ビットと32ビットのイメージタイプを収録したアイコンを用意すれば、ほとんどの場面で対応できる。

○Windowsにおける各イメージタイプの使用例

Windows 8 エクスプローラーにおける特大アイコン表示 (256x256)
Image: View very large icons in Windows 8

Windows 8 エクスプローラーにおける大アイコン表示 (256x256を自動縮小)
Image: View large icons in Windows 8

Windows 8 エクスプローラーにおける中アイコン表示 (48x48)
Image: View medium icons in Windows 8

Windows 8 エクスプローラーにおける小アイコン表示 (16x16)
Image: View small icons in Windows 8

Windows 8 タイトルバーにおけるアイコン表示 (16x16)
Image: View an icon at titlebar in Windows 8

Windows 8 タスクバーにおけるアイコン表示 (32x32)
Image: View an icon at taskbar in Windows 8

Windows XP エクスプローラーにおける「並べて表示」アイコン表示 (48x48)
Image: View an icon in Windows XP Explorer

Windows XP エクスプローラーにおける「アイコン」アイコン表示 (32x32)
Image: View an icon in Windows XP Explorer

Windows XP スタートメニュー右側におけるアイコン表示 (24x24)
Image: View an icon at Startmenu in Windows XP

Windows 98におけるサイズ別のアイコンファイル表示 (exeファイルは全てのサイズを含む。)
Image: View icon files various color depth in Windows 98

○アイコンを制作する

マイクロソフト公式でアイコン制作のヒントが公開されている。この辺りを参考にPNGで各イメージタイプの画像を作成して、それをアイコンファイル(*.ico)に変換する。
アイコン - MSDNライブラリ ガイドライン

アイコンファイルへの変換にはフリーソフトの@icon変換が便利。
@icon変換 - Vector

マイクロソフト公式のツールにこだわるならVisual Studioに搭載されているアイコンエディターを使うことになるが、こちらは32ビット(アルファチャンネル)のイメージタイプを作成・編集することができない。(削除は可能。現在最新のVisual Studio 2012も同様。) 上のマイクロソフト公式文書でもサードパーティーのソフトを推奨している。

ここからが今回の本題。

○アイコンファイルの256x256ドットイメージタイプの形式をPNGに変換する

アイコンファイルに256x256ドットのイメージタイプが含まれている場合、これがBMPだとサイズが非常に大きくなってしまうので、PNGに変換しておく。256x256ドットはPNGに対応したWindows Vista以降でしか使われないので、XP以前との互換性は維持できる。

@icon変換を起動してアイコンファイルを開き、メニューバーから「オプション」→「Vistaアイコンの保存」→「Vista形式」を選択する。
「リスト」→「すべて選択」としてから「ファイル」→「マルチアイコンとして保存...」、でアイコンファイルを保存する。

○アイコンファイルから不要なイメージタイプを削除する

リソースとして組み込むアプリケーションで使わないアイコンイメージタイプを削除しておく。例えばフォーム(タイトルバーとタスクバー)でしか使わないアイコンなら、16x16ドットと32x32ドットのアイコンを残して他は削除しておく。

[@icon変換を使う場合]
該当するアイコンを選択して、ツールバーの「選択アイテムの削除」ボタンをクリック。または右クリックコンテキストメニューから「削除」。
Image: Remove icon image type using @Icon sushi

[Visual Studioのアイコンエディターを使う場合]
アイコンファイルを開いて、左のアイコンリストから該当するアイコンを選択。右クリックして「イメージタイプの削除」を選択する。なお、Visual Studio 2005以前では256x256ドットのイメージタイプを含むアイコンファイルは編集できない。
Image: Remove icon image type using Visual Studio 2008 Icon Editor

○アイコンファイルをリソースファイルに埋め込む

ここからはVisual Studio(.NET Framework)のVisual C#を対象に話を進めていく。

C#プログラム上からリソースを利用する方法はいくつかある。
フォームのアイコン(→System.Windows.Forms.Form.Icon)を設定する場合、Windowsフォームデザイナーのプロパティでアイコンを設定すると、各フォームに自動で作成されるリソースファイル(*.resx)にアイコンデータが追加される。これだとリソースの使い回しができない(ResourceManagerクラスを使えばできるが、余分にコードが増える)。さらに、普段は見えないがフォーム付属のリソースファイルに大量のコードが追加されて、ソースファイルが肥大化する原因になる。
Image: View a resource file (*.resx) using EmEditor v11

そこで、別にリソースファイルを作成してそこにアイコンファイルを追加して、プログラムソースにアイコンを読み込む処理を加える。

ソリューションエクスプローラーでソリューション名を右クリックして、「追加」→「新しい項目」。「アセンブリリソースファイル「を追加する。
Image: Add an assembly resource file to the project

ドラッグアンドドロップでアイコンを追加して、リソースとしてわかりやすい名前(ICON_***など)に変更する。
Image: Add a resource to the resouce file.

フォームのコンストラクタに次のようにコードを書き加える。この手法はVisual Studio 2005以降で有効。

public Form1()
{
    InitializeComponent();
    this.Icon = Res.ICON_MixedMediaFile;
}

これがWindowsフォームデザイナーで設定できればいいのだが、今のところ対応するつもりはないようだ。

EXEファイルのアイコンはプロジェクトのPropertiesページで指定する。
Image: Property page in VS2008

ここでの設定はビルド時にcsc.exeへ/win32iconスイッチで渡される。ここで設定したアイコンリソースは使い回しができない、と思う。使い回したいならリソースエディタでWin32リソースファイル(*.rc)を作らなければいけないのかな。
ということで、同一の絵であってもEXEファイル用のアイコン(16x16/BMP, 32x32/BMP, 48x48/BMP, 256x256/PNG)とフォーム用のアイコン(16x16/BMP, 32x32/BMP)でファイルを分けておく。

○参考文献

[EOF]


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!