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
?
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
?
Antworten:
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:
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();
}
}
}
Sie könnten es einfach so verwenden:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
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 neues MemoryStream
, speichert das Bitmap
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 einer ImageConverter
Klasse mithilfe vonMemoryStream
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.
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);
}
}
.
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
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
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 a FileStream
wie folgt:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
nicht GetBuffer
.
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 von GetBuffer
das Bild plus nicht verwendete Bytes zurück, was wahrscheinlich zu einem beschädigten Bild führt.
Versuche Folgendes:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
Stellen Sie sicher, dass Sie Folgendes verwenden:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
Einfacher:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
Verwenden Sie dies ganz einfach in einer Zeile:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");