回答:
いくつかの方法があります。
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
これは多くのコードを必要としないので便利です。
メモリストリーム
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
これは、ファイルがディスクではなくメモリに保存されることを除いて、あなたがやっていることと同じです。さらに多くのコードがありますが、ImageFormatのオプションがあり、メモリまたはディスクへの保存の間に簡単に変更できます。
ImageConverter
メソッドは画像をPNGとして保存し、結果として巨大なファイルになることに注意してください。
ImageConverter
使用する.netの標準ではありませんMemoryStream
これには、MemoryStreamが役立ちます。あなたはそれを拡張メソッドに置くことができます:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
あなたはちょうどそれを次のように使うことができます:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
ImageConverterに関するprestomaniftoの回答に一部同意しません。 ImageConverterは使用しないでください。 技術的に問題はありませんが、オブジェクトからのボックス化/ボックス化解除を使用しているという事実は、.NETフレームワークの古い暗い場所からのコードであり、画像処理で使用するのは理想的ではないことを示しています(バイトに変換するのはやり過ぎです) []少なくとも)、特に次のことを考慮した場合。
私はImageConverter
.Netフレームワークで使用されているコードを調べました。内部では、上記で提供したコードとほぼ同じコードを使用しています。新しいを作成し、を指定したときの形式でをMemoryStream
保存しBitmap
、配列を返します。ImageConverter
を使用してクラスを作成する余分なオーバーヘッドをスキップするMemoryStream
ビットマップデータをMarshal.Copyすることもできます。中間メモリストリームなどはなく、高速メモリコピー。これは、24ビットと32ビットの両方のビットマップで機能します。
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
。
画像をMemoryStreamに保存してから、バイト配列を取得します。
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
System.Drawing.Image
(参照:docs.microsoft.com/en-us/dotnet/api/…)
System.Drawing.Image does not exist
。したがって、..いいえ、機能しません:(
次のように、のMemoryStream
代わりにを使用しますFileStream
。
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
ではなくGetBuffer
。
Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
したがって、fromのバイト配列GetBuffer
はイメージと未使用のバイトを返します。これにより、イメージが破損する可能性があります。
以下を試してください:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
以下を使用していることを確認してください:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
非常に簡単にこれを1行で使用します。
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");