実行ファイル(*.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)

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

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

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

Windows 8 タイトルバーにおけるアイコン表示 (16x16)

Windows 8 タスクバーにおけるアイコン表示 (32x32)

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

Windows XP エクスプローラーにおける「アイコン」アイコン表示 (32x32)

Windows XP スタートメニュー右側におけるアイコン表示 (24x24)

Windows 98におけるサイズ別のアイコンファイル表示 (exeファイルは全てのサイズを含む。)

○アイコンを制作する
マイクロソフト公式でアイコン制作のヒントが公開されている。この辺りを参考に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変換を使う場合]
該当するアイコンを選択して、ツールバーの「選択アイテムの削除」ボタンをクリック。または右クリックコンテキストメニューから「削除」。

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

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

そこで、別にリソースファイルを作成してそこにアイコンファイルを追加して、プログラムソースにアイコンを読み込む処理を加える。
ソリューションエクスプローラーでソリューション名を右クリックして、「追加」→「新しい項目」。「アセンブリリソースファイル「を追加する。

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

フォームのコンストラクタに次のようにコードを書き加える。この手法はVisual Studio 2005以降で有効。
public Form1()
{
InitializeComponent();
this.Icon = Res.ICON_MixedMediaFile;
}
これがWindowsフォームデザイナーで設定できればいいのだが、今のところ対応するつもりはないようだ。
EXEファイルのアイコンはプロジェクトのPropertiesページで指定する。

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