C#で32bitアイコンファイル(.ico)を作成

C#には標準で「Icon」クラスがあり、アイコンファイルの出力を一応サポートしています。が、この方法では16色のアイコンしか出力出来ません。 なのでアイコンファイルのフォーマットを元に、ヘッダやデータ領域をバイナリ形式で書き出します。

ソースコードが長いのでポイントになりそうな箇所だけ一応説明入れていますが、読み飛ばしても問題無いと思います。 「使用例」のみですぐに使用出来るようにしたつもりです。

ダウンロード

対応事項

  • 入力画像形式は「BMP」「GIF」「JPG」「PNG」「TIFF」となります。「32bit アルファチャンネル(透過)有り」に対応しています。
  • 出力画像形式は「BMP」「PNG」形式となります。いずれも「32bit アルファチャンネル(透過)有り」に対応しています。
  • 最大サイズは256×256(Windows Vista以降で表示可能)となります。
  • 一つのアイコンファイルでサイズの違うアイコンをまとめて格納する「マルチアイコン」形式に対応しています。
  • 1/4/8/16/24bitアイコン形式とマスクデータに対応しています。

使用例

以下に使用例を示します。「System.Drawing 名前空間」を使用していますので、コンソールアプリケーションの場合は「プロジェクト」→「参照の追加」→「.NET」タブ→「System.Drawing」を追加して下さい。 フォームアプリケーションの場合は初めから参照に含まれていますので特に設定不要です。使用するのは「IconMaker.cs」と「ColorQuantizer.cs」です。「ColorQuantizer.cs」は減色用のプログラムですので 直接は使用しません。プロジェクトへ追加するだけでOKです。

using System;
using IconMaker;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            I2IConverter i2ic = new I2IConverter();
            i2ic.LoadImage("./Sample.png");
            i2ic.ConvertInfoList.Add(new IconConvertInfo(EPictureFormat.PNG, 256, 256, EColorDepth.CD_32BIT));
            i2ic.ConvertInfoList.Add(new IconConvertInfo(EPictureFormat.BMP, 128, 128, EColorDepth.CD_32BIT));
            i2ic.ConvertInfoList.Add(new IconConvertInfo(EPictureFormat.BMP, 48, 48, EColorDepth.CD_32BIT));
            i2ic.ConvertInfoList.Add(new IconConvertInfo(EPictureFormat.BMP, 32, 32, EColorDepth.CD_32BIT));
            i2ic.ConvertInfoList.Add(new IconConvertInfo(EPictureFormat.BMP, 16, 16, EColorDepth.CD_32BIT));
            i2ic.SaveIcon("./Sample.ico");
        }
    }
}

(10行目) まずインスタンスを作成します。

(11行目) ベース画像の読み込みを行います。画像ファイルのパスか、ストリームを指定します。

(12~16行目) アイコンファイルに含めるアイコンの「画像形式、幅、高さ、色数」を指定します。 「画像形式」は32bit時はPNGまたはBMP、それ以下の色数ではBMPにして下さい。また「幅、高さ」は同じ値にして下さい。

(17行目) アイコンファイルを保存します。

「IconConvertInfo」には他にも「Interpolation(画像の拡大縮小アルゴリズム)」「ErrorDiffusion(減色時の誤差拡散有無)」「TransparentThreshold(アルファマスク作成時の透過率)」が設定できます。

「Interpolation(画像の拡大縮小アルゴリズム)」はバイリニアやニアレストレイバーといったアルゴリズムが選択できます。

「ErrorDiffusion(減色時の誤差拡散有無)」をONにすることにより、256色以下に減色する場合にそこそこ自然(?)な減色が行えると思います。デフォルトは「ON」です。

「TransparentThreshold(アルファマスク作成時の透過率)」は設定値より小さい透過率をアルファマスクとして扱う設定です。デフォルトは「128」としています。

「IconMaker.cs」「ColorQuantizer.cs」共にソースコードが巨大化した為サンプルは載せていません。ソースコードは公開していますがコメントはあまり書いていませんので参考程度にお願いします。