web-dev-qa-db-ja.com

ビットマップをバイト配列に変換します

C#を使用して、一時ファイルに保存してBitmapを使用して結果を読み取るよりも、WindowsのFileStreambyte[]に変換するより良い方法はありますか。

207
Jeremy McGee

いくつかの方法があります。

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のオプションがあり、それはメモリまたはディスクへの保存の間に簡単に修正することができます。

出典: http://www.vcskicks.com/image-to-byte.php

372
prestomanifesto

これには、 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フレームワークの古い暗い場所からのコードであることを示しています。特に次のことを考えると、画像処理で使うのは理想的ではありません(少なくともbyte []に​​変換するのはやり過ぎです)。

私は.Netフレームワークで使用されているImageConverterコードを見ましたが、内部的には上で提供したものとほぼ同じコードを使用しています。これは新しいMemoryStreamを作成し、それを提供したときの形式でBitmapを保存して、その配列を返します。 ImageConverterを使用してMemoryStreamクラスを作成するための余分なオーバーヘッドをスキップする

84

ビットマップデータを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);
    }

}

39
deegee

ImageをMemoryStreamに保存してから、バイト配列を取得します。

http://msdn.Microsoft.com/ja-jp/library/ms142148.aspx

  Byte[] data;

  using (var memoryStream = new MemoryStream())
  {
    image.Save(memoryStream, ImageFormat.Bmp);

    data = memoryStream.ToArray();
  }
15
Chris Baxter

このように、MemoryStreamではなくFileStreamを使用してください。

MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
9
Jeff Reddy

以下を試してください。

MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);

byte[] byteArray = stream.GetBuffer();

使用していることを確認してください。

System.Drawing & using System.Drawing.Imaging;
7
Francis Gilbert

私はあなたが単にすることができると思います:

ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
6
Kevek
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
5
62071072SP

よりシンプル:

return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
4
Moises Conejo