it-swarm.it

Converti una bitmap in una matrice di byte

Usando C #, c'è un modo migliore per convertire un Bitmap di Windows in un byte[] che salvare in un file temporaneo e leggere il risultato usando un FileStream?

207
Jeremy McGee

Ci sono un paio di modi.

ImageConverter

public static byte[] ImageToByte(Image img)
{
    ImageConverter converter = new ImageConverter();
    return (byte[])converter.ConvertTo(img, typeof(byte[]));
}

Questo è conveniente perché non richiede molto codice.

Memory Stream

public static byte[] ImageToByte2(Image img)
{
    using (var stream = new MemoryStream())
    {
        img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
        return stream.ToArray();
    }
}

Questo è equivalente a quello che stai facendo, tranne che il file viene salvato in memoria anziché su disco. Sebbene più codice abbia l'opzione di ImageFormat, può essere facilmente modificato tra il salvataggio in memoria o il disco.

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

372
prestomanifesto

A MemoryStream può essere utile per questo. Puoi metterlo in un metodo di estensione:

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();
        }
    }
}

Potresti semplicemente usarlo come:

var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);

Sono parzialmente in disaccordo con la risposta di prestomanifto in merito a ImageConverter. Non usare ImageConverter. Non c'è nulla di tecnicamente sbagliato in questo, ma semplicemente il fatto che usi boxing/unboxing da object mi dice che è il codice dai vecchi posti bui del framework .NET. e non è ideale da usare con l'elaborazione delle immagini (è eccessivo per la conversione in un byte [] almeno), specialmente se si considera quanto segue.

Ho dato un'occhiata al codice ImageConverter usato dal framework .Net, e internamente utilizza un codice quasi identico a quello che ho fornito sopra. Crea un nuovo MemoryStream, salva Bitmap in qualsiasi formato fosse quando lo hai fornito e restituisce l'array. Evita l'overhead aggiuntivo della creazione di una classe ImageConverter usando MemoryStream

84

Puoi anche solo Marshal.Copy i dati bitmap. Nessun memoriale intermedio ecc. E una copia veloce della memoria. Questo dovrebbe funzionare sia con bitmap a 24 bit che a 32 bit.

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

Salvare l'immagine in un MemoryStream e quindi afferrare l'array di byte.

http://msdn.Microsoft.com/en-us/library/ms142148.aspx

  Byte[] data;

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

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

Usa un MemoryStream invece di un FileStream, come questo:

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

Prova quanto segue:

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

byte[] byteArray = stream.GetBuffer();

Assicurati di utilizzare:

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

Credo che tu possa semplicemente fare:

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

Più semplice:

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