ImageConverterクラス

ImageConverterクラスでは、Imageクラスのオブジェクトを他のデータ形式と相互に変換できます。

メソッド

すべてがTypeConverterから継承したメソッドで、それに以下のメソッドがオーバーライドされています。

public override bool   CanConvertFrom(ITypeDescriptorContext context, Type sourceType);
public override bool   CanConvertTo(ITypeDescriptorContext context, Type destinationType);
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value);
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType);

public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes);
public override bool                         GetPropertiesSupported(ITypeDescriptorContext context);

ConvertTo()

public object ConvertTo(
    object value,
    Type destinationType
)
ConvertTo(Object, Type) - TypeConverter.ConvertTo メソッド (System.ComponentModel) | Microsoft Learn

指定のオブジェクトを、指定の型に変換できます。

Bitmap bitmap = new Bitmap("sample.bmp");

ImageConverter imageConverter = new ImageConverter();
byte[] bytes = (byte[])imageConverter.ConvertTo(bitmap, typeof(byte[]));

このときbyte配列へ変換するならば、MemoryStreamを用いても可能です。ConvertTo - ImageConverter.ConvertTo

byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
    bitmap.Save(ms, ImageFormat.Bmp);
    bytes = ms.ToArray();
}

このように出力されるbyte配列はヘッダも含む画像ファイルの情報そのものであり、

Bitmap bitmap = new Bitmap(2, 2);
bitmap.SetPixel(0, 0, Color.FromArgb(1, 2, 3));
bitmap.SetPixel(1, 1, Color.FromArgb(4, 5, 6));


ImageConverter imageConverter = new ImageConverter();
byte[] bytes1 = (byte[])imageConverter.ConvertTo(bitmap, typeof(byte[]));

string hex1 = BitConverter.ToString(bytes1);
// 89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49-48-44-52-00-00-00-02-00-00-00-02-08-06-00-00-00-72-B6-0D-24-00-00-00-01-73-52-47-42-00-AE-CE-1C-E9-00-00-00-04-67-41-4D-41-00-00-B1-8F-0B-FC-61-05-00-00-00-09-70-48-59-73-00-00-0E-C3-00-00-0E-C3-01-C7-6F-A8-64-00-00-00-13-49-44-41-54-18-57-63-60-64-62-FE-CF-00-03-2C-AC-6C-FF-01-0F-8C-02-14-E4-C1-2A-4B-00-00-00-00-49-45-4E-44-AE-42-60-82

とすると確認できる先頭の"89-50-4E-47-0D-0A-1A-0A"は、PNGのヘッダです。そして

bitmap.Save("sample.bmp");

としてファイルに出力される情報も、このbyte配列に一致します。一方でピクセル データだけを得たいならば、Bitmap.LockBits()を用います。

BitmapData bitmapData = bitmap.LockBits(
    new Rectangle(Point.Empty, bitmap.Size),
    ImageLockMode.ReadOnly,
    bitmap.PixelFormat);

byte[] bytes2 = new byte[bitmapData.Stride * bitmap.Height];
Marshal.Copy(bitmapData.Scan0, bytes2, 0, bytes2.Length);
bitmap.UnlockBits(bitmapData);

string hex2 = BitConverter.ToString(bytes2);
// 03-02-01-FF-00-00-00-00-00-00-00-00-06-05-04-FF

ConvertFrom()

逆に他の型からImageへ変換するには、ConvertFrom()を用います。

public object ConvertFrom (object value);
ConvertFrom(Object) - TypeConverter.ConvertFrom メソッド (System.ComponentModel) | Microsoft Learn

変換時に「使用されたパラメーターが有効ではありません。(Parameter is not valid.)」としてArgumentExceptionが投げられるならば、valueがヘッダも含む適切な画像データであることを確認します。

Microsoft Learnから検索