アイコンリソースの最適化と実行ファイルサイズの削減 [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)
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)でファイルを分けておく。
○参考文献
- アイコン - MSDNライブラリ ガイドライン [2007]
http://msdn.microsoft.com/ja-jp/library/aa511280.aspx - What is an Icon? - Axialis IconWorkshop Help! [2008]
http://www.axialis.com/docs/iw/What_is_an_Icon.htm - Which icon sizes should my Windows application's icon include? - stackoverflow [2010/07]
http://stackoverflow.com/questions/3236115/which-icon-sizes-should-my-windows-applications-icon-include - VS.NETで画像などのリソースを利用するには?(準備編) [2004/10]
http://www.atmarkit.co.jp/fdotnet/dotnettips/214resources1/resources1.html
[EOF]