ミニタイマー(10) - Windows 7 のアプリケーション・アイコン作成

公開:2011-05-05 19:37
更新:2020-02-15 04:36
カテゴリ:windows,その他api,ミニタイマー,c++

はじめに

今日はPCが壊れてしまい復旧のため半日を要したのだが、なんとか落ち着いたのでWindows 7のアプリケーション・アイコン作成について書いておくことにした。

Windows 7 アプリケーション・アイコンの要件

昨日私はアイコン作成に(軽いめに)挫折した。なぜかというと、Windows 7のアプリケーションアイコンの仕様により多数のビットマップを.icoファイルに収めなくてはならないからである。その他の要件もあるが技術的な要件だけをあげると、

上記はほぼ必須(MUST)要件である。高DPIの為に用意しておいたほうがよいサイズもある(20 × 20と40 × 40)が必須ではない。「ほぼ」と書いたのは、16×16と32×32のサイズのビットマップを用意しておけばとりあえずはOSが適当に拡大・縮小して表示してくれるためである。私の環境で16×16と32×32の32ビットアルファビットマップを用意してエクスプローラで試してみたら、下記のとおりに補完された。

16×16ピクセル
16×16のアイコンを等倍で表示。
16×16~32×32
32×32のアイコンを縮小して表示。
32×32~48×48
32×32のアイコンを拡大して表示。
48×48~256×256
32×32のアイコンを48×48に拡大したビットマップを固定サイズで表示。

ビットサイズ毎の補完は私の環境では32bit・16bitカラーのみ対応なのですべては検証できなかったが、きちんと補完してくれた。

補完機能があるので用意するビットマップを端折っていいという事ではない。上記のような挙動はおそらく過去アプリの互換性を保つためであろう。

つまり、Windows 7 のアプリケーションアイコンで用意しないといけないのは16種類となる。グラフィック・エディタでビットマップを16個もつくるというのは私にはとても面倒であるし、256×256のアイコンはそれなりデザインセンスも問われる。UXガイドラインの「アイコンのデザインと作成」には下記のように書いてあるぐらいである。

  • 経験豊富なグラフィック デザイナーに依頼します。優れたグラフィックス、イメージ、およびアイコンを作成するには、専門家と協力してください。ベクター アートや 3D プログラムを使用したイラストの作成経験がある専門家との協力をお勧めします。
  • アイコンの作成はコストがかかる可能性があるため、前もって検討します。既存の詳細情報および要件を収集します。これには、必要とされるアイコン セット、主要機能とそれぞれの意味、セット内で明確に表現するファミリ (群)、ブランド要件、正確なファイル名、コード内で使用するイメージ形式、サイズ要件などが含まれます。デザイナーとの作業時間を最大限に活用できるように、事前に準備します。

自作ソフトのアイコンでグラフィックデザイナーと綿密な検討をしなくてはいけないとは...。そういうわけで(軽いめに)挫折するに至ったのである。ただ、16種類かつデザインもそれなりの物をものを用意するのは大変だという認識はMS側にもある(UXガイドラインを読むとそう感じる)ようなので、何か「ほっと」したりして。

アイコン作成ツール

でもこういうものはある程度自動的に生成できるのではないか、巷のアイコン作成ツールというのはそういう便利な機能があるのではないかと思い、調べたらやはりあった!フリーのIcoFXツールには「イメージからWindowsアイコンへ」という機能がある。

これを使うと一気にイメージが作れるのでとても便利である。ただ64×64のビットマップは自動生成できないが、クラシック・モードへの対応はとりあえず省略することで端折ることにした。

InkScape

イメージは自動的に生成される事はわかったが、ディザリングが施されるものの元サイズと大きく異なるとかなり粗くなってしまい、レタッチが必要なのではないかと考えた。やはりすべてを自動生成するわけにはいかないのではないか。最低でも32ビットカラーの各サイズの物を自前で用意する必要はある。が、IcoFXのエディット機能はやはりGIMPとかと比べるとビットマップエディタ部分の機能は劣るので作りづらい。でもGIMPでも各サイズを作るのも絵心のない私にはつらい。そこでInkScapeの登場である。

InkScapeはベクターグラフィックエディタなのでビットマップのサイズごとに作る必要はなくなる。1つのデザインさえ作れば後はどんなサイズにでも綺麗にエクスポートできる。しかしInkScapeはアイコンエディタではないので、各サイズのビットマップを収めた.icoファイルの生成はできない。そこはIcoFXのインポート機能を使ってInkScapeのエクスポートデータを.icoファイルにまとめることにした。

アイコンのデザインをInkScapeで作ることにしたけれど、InkScapeを使ったからといって絵心を自動的に補完してくれるわけでもなく、また使い方もよく分かっていないので結局上図の単純なデザインに落ち着いた。この程度ならIcoFXでも十分デザインできるし、256×256から各ビットサイズ・サイズのデータを生成してもそんなに粗くならないことが後でわかった。。

実際に仕様通りにアイコンをつくって表示してみると、OSはビットマップをうまく使ってアイコンを表示してくれる。調べると下記の通りであった。

16×16ピクセル
16×16のアイコンを等倍で表示。
16×16~32×32
32×32のアイコンを縮小もしくは等倍で表示。
32×32~48×48
48×48のアイコンを縮小もしくは等倍で表示。
48×48~256×256
256×256のアイコンを縮小もしくは等倍で表示。

アイコンキャッシュ

そういうわけでなんとかWindows 7に対応した.icoファイルを作ったのだけれど、実際にリソースに格納し、エクスプローラで表示してみると何かオカシイ。1つ前の古いアイコンが、特定の大きさ(48×48)の場合表示されてしまうのである。再起動をしてみたものの、どうもうまくいかない。ひょっとして アイコンビットマップってキャッシュされるのかと思ったらそうだった。IconCache.dbを削除して再起動するときちんと表示されるようになった。しかしこれは不便だ。アイコンを変えるたびにIconCache.dbを削除しなければならない。。どうしたものか。。

でも他のサイズはキャッシュされないようなので、どういうサイズのものがキャッシュされるのかもう少し詳しく調べたら、48×48と256×256がキャッシュされることが分かった。16×16と32×32はキャッシュされないこともわかった。何回か再起動してみたがやはりキャッシュは更新されない。アイコン・キャッシュってどのようなタイミングで更新されるのだろう。仕様を調べてみないと。。

なんか泥沼だな。。