Ich erstelle eine Remotedesktop-Freigabeanwendung, in der ich ein Bild des Desktops aufnehme, komprimiere und an den Empfänger sende. Um das Bild zu komprimieren, muss ich es in ein Byte [] konvertieren.
Derzeit benutze ich dies:
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 (Verlangsamung) sowie 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?
MemoryStream
; Es handelt sich um eine vollständig verwaltete Ressource, es sei denn, Sie verwenden sie beim Remoting. In beiden Fällen wäre es unangemessen, die Ressource zu entsorgen.Antworten:
Nein . Um ein Bild zu einer Byte - Array zu konvertieren Sie haben ein Bildformat angeben - so wie Sie eine Codierung angeben, wenn Sie Text in einer Byte - Array zu konvertieren.
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 wenn Sie ein Format auswählen , das tut Kompression ist, gibt es keinen Punkt in dann danach den Byte - Array Komprimieren - es ist fast sicher ist , keine positive Wirkung haben.
quelle
imageIn.RawFormat
welche Versuche ausgeführt werden sollen, um die Rohbildbytes ohne weitere Neucodierung zu speichern.Es gibt eine RawFormat-Eigenschaft des Image-Parameters, die das Dateiformat des Bildes zurückgibt. Sie könnten Folgendes versuchen:
quelle
myObject.Dispose()
oderusing(myObject){}
- beide tun dasselbe, aber die using-Anweisung erstellt im Grunde einen Bereich, der für Sie bereinigt.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 zu vergleichen und zu sehen, wie sie mit Ihrer aktuellen Methode verglichen wird.
quelle
quelle
quelle
Der schnellste Weg, den ich herausfinden konnte, ist folgender:
Ich hoffe, nützlich zu sein
quelle
System.Windows.Controls.Image
Objekte haben würden . Wenn Sie eines davon in Bytes konvertieren möchten und es als an diese Zeile übergebenInputImg
, funktioniert dies nicht. Es erwartet einSystem.Drawing.Image
Objekt.