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);
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
逆に他の型からImageへ変換するには、ConvertFrom()を用います。
public object ConvertFrom (object value);ConvertFrom(Object) - TypeConverter.ConvertFrom メソッド (System.ComponentModel) | Microsoft Learn
変換時に「使用されたパラメーターが有効ではありません。(Parameter is not valid.)」としてArgumentExceptionが投げられるならば、valueがヘッダも含む適切な画像データであることを確認します。