it-swarm.com.de

Der schnellste Weg, um ein Bild in ein Byte-Array zu konvertieren

Ich erstelle eine Remotedesktop-Freigabeanwendung, in der ich ein Abbild des Desktops aufnehme, komprimiere und an den Empfänger sende. Um das Bild zu komprimieren, muss ich es in ein Byte [] konvertieren.

Zur Zeit benutze ich folgendes:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return  ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}

Aber ich mag es nicht, weil ich es in einem ImageFormat speichern muss und das möglicherweise auch Ressourcen verbraucht (Verlangsamen) und unterschiedliche Komprimierungsergebnisse erzeugt. Ich habe weiter mit Marshal.Copy und memcpy gelesen, kann es aber nicht verstehe sie.

Gibt es also eine andere Methode, um dieses Ziel zu erreichen?

101
user2529551

Gibt es also eine andere Methode, um dieses Ziel zu erreichen?

Nein. Um ein Bild in ein Byte-Array umzuwandeln, müssen Sie ein Bildformat angeben , genau wie Sie beim Konvertieren von Text eine Codierung angeben müssen zu einem Byte-Array.

Wenn Sie sich Sorgen über Komprimierungsartefakte machen, wählen Sie ein verlustfreies Format. Wenn Sie sich Sorgen um die CPU-Ressourcen machen, wählen Sie ein Format, das die Komprimierung nicht stört - zum Beispiel nur rohe ARGB-Pixel. Aber das führt natürlich zu einem größeren Byte-Array.

Beachten Sie, dass es keinen Sinn macht, das Byte-Array nachträglich zu komprimieren, wenn Sie ein Format auswählen, das Komprimierung enthält - es hat mit ziemlicher Sicherheit keine vorteilhaften Auswirkungen.

39
Jon Skeet

Es gibt eine RawFormat-Eigenschaft des Image-Parameters, die das Dateiformat des Bildes zurückgibt. Sie könnten Folgendes versuchen:

// extension method
public static byte[] imageToByteArray(this System.Drawing.Image image)
{
    using(var ms = new MemoryStream())
    {
        image.Save(ms, image.RawFormat);
        return ms.ToArray();
    }
}
50
Newt
public static byte[] ReadImageFile(string imageLocation)
    {
        byte[] imageData = null;
        FileInfo fileInfo = new FileInfo(imageLocation);
        long imageFileLength = fileInfo.Length;
        FileStream fs = new FileStream(imageLocation, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        imageData = br.ReadBytes((int)imageFileLength);
        return imageData;
    }
13
bhadresh

Ich bin mir nicht sicher, ob Sie aus Gründen, auf die Jon Skeet hingewiesen hat, große Gewinne erzielen werden. Sie können jedoch versuchen, die TypeConvert.ConvertTo -Methode als Benchmark zu verwenden, um zu sehen, wie sie mit der aktuellen Methode verglichen wird.

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
13
keyboardP
public static class HelperExtensions
{
    //Convert Image to byte[] array:
    public static byte[] ToByteArray(this Image imageIn)
    {
        var ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms.ToArray();
    }

    //Convert byte[] array to Image:
    public static Image ToImage(this byte[] byteArrayIn)
    {
        var ms = new MemoryStream(byteArrayIn);
        var returnImage = Image.FromStream(ms);
        return returnImage;
    }
}
4
Ahmad Aghazadeh

Der schnellste Weg, den ich herausfinden konnte, ist der folgende:

var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));

Ich hoffe, nützlich zu sein

2
alireza amini