Iconをbyte配列に変換する C#

29 March 2015
#CSharp

Iconをデータベースに保存する需要があり、Image型(byte配列)に変換することになりました。

Icon→byte[]

以下に、ファイルに関連付けられたIconをbyte配列に変換するコードを示します。
using (Icon icon = Icon.ExtractAssociatedIcon(filePath))
{
    using (var ms = new MemoryStream())
    {
        Bitmap bmp = icon.ToBitmap();
        bmp.Save(ms, ImageFormat.Png);
        byte[] binary = ms.GetBuffer();
    }
}

ちなみに、ImageFormatは素直にBmpにすると透過情報が保持されません。

あと、Bitmapを経由せずにIconクラスのSave()メソッド呼び出して、icon.Save(ms);みたいにすると色情報がごっそり削られますのでご注意を…

byte[]→BitmapSource

おまけで、byte配列の画像をWPFのImageコントロールに表示するコードです。
byte[] binary;
using (var ms = new MemoryStream(binary))
{
    var bitmapDecoder = BitmapDecoder.Create(
        ms, 
        BitmapCreateOptions.PreservePixelFormat, 
        BitmapCacheOption.OnLoad);

    var writable = new WriteableBitmap(bitmapDecoder.Frames.Single());
    writable.Freeze();

    this.Image.Source = writable as BitmapSource;
}
4423.ch