Gibt es mit C # eine bessere Möglichkeit, ein Windows Bitmap
in ein zu konvertieren , byte[]
als in eine temporäre Datei zu speichern und das Ergebnis mit einem zu lesen FileStream
?
233
Es gibt verschiedene Möglichkeiten.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Dieser ist praktisch, weil er nicht viel Code erfordert.
Speicherstrom
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Dieser entspricht dem, was Sie tun, außer dass die Datei im Speicher statt auf der Festplatte gespeichert wird. Obwohl Sie mehr Code haben, haben Sie die Option von ImageFormat und es kann leicht zwischen dem Speichern auf Speicher oder Festplatte geändert werden.
ImageConverter
Methode das Bild als Png speichert, was zu RIESIGEN Dateien führt.ImageConverter
ist kein .net-Standard, den Sie verwenden könntenMemoryStream
Ein MemoryStream kann dabei hilfreich sein. Sie könnten es in eine Erweiterungsmethode setzen:
Sie könnten es einfach so verwenden:
Ich bin teilweise anderer Meinung als die Antwort von prestomanifto in Bezug auf den ImageConverter. Verwenden Sie ImageConverter nicht. Es ist technisch nichts falsch daran, aber die Tatsache, dass es Boxing / Unboxing von Objekt verwendet, sagt mir, dass es Code aus den alten dunklen Stellen des .NET Frameworks ist und nicht ideal für die Bildverarbeitung ist (es ist übertrieben für die Konvertierung in ein Byte [] zumindest), insbesondere wenn Sie Folgendes berücksichtigen.
Ich habe mir den
ImageConverter
Code angesehen, der vom .Net-Framework verwendet wird, und intern wird Code verwendet, der fast identisch mit dem oben angegebenen ist. Es erstellt ein neuesMemoryStream
, speichert dasBitmap
in dem Format, in dem es bei der Bereitstellung angegeben wurde, und gibt das Array zurück. Überspringen Sie den zusätzlichen Aufwand beim Erstellen einerImageConverter
Klasse mithilfe vonMemoryStream
quelle
Sie können auch nur Marshal.Copy die Bitmap-Daten. Kein zwischengeschalteter Memorystream usw. und eine schnelle Speicherkopie. Dies sollte sowohl auf 24-Bit- als auch auf 32-Bit-Bitmaps funktionieren.
.
quelle
Speichern Sie das Image in einem MemoryStream und greifen Sie dann auf das Byte-Array zu.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
quelle
System.Drawing.Image
(siehe: docs.microsoft.com/en-us/dotnet/api/… )System.Drawing.Image does not exist
. Also .. nein, funktioniert nicht :(Verwenden Sie a
MemoryStream
anstelle von aFileStream
wie folgt:quelle
ToArray
nichtGetBuffer
.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.
Jetzt gibt das Byte-Array vonGetBuffer
das Bild plus nicht verwendete Bytes zurück, was wahrscheinlich zu einem beschädigten Bild führt.Versuche Folgendes:
Stellen Sie sicher, dass Sie Folgendes verwenden:
quelle
Ich glaube, Sie können einfach tun:
quelle
quelle
Einfacher:
quelle
Verwenden Sie dies ganz einfach in einer Zeile:
quelle