Ich habe alle Fragen zum Byte-Array durchsucht, bin aber immer gescheitert. Ich habe noch nie c # codiert. Ich bin neu auf dieser Seite. Könnten Sie mir helfen, wie man eine Bilddatei aus einem Byte-Array erstellt?
Hier ist meine Funktion, die Bytes im Array mit dem Namen speichert imageData
public void imageReady( byte[] imageData, int fWidth, int fHeight))
Bitmap(Stream)
: "Sie müssen den Stream für die Lebensdauer der Bitmap offen halten."MemoryStream
, müssen Sie sich keine Sorgen machen, es jemals zu schließen, da dasMemoryStream
nichts tut, wenn es sowieso entsorgt wird. DieSystem.Drawing.ImageConverter.ConvertFrom
Methode nutzt diese Tatsache tatsächlich aus, so dass es sicher erscheint, diese Annahme zu treffen. Tun, einfachvar bmp = new Bitmap(new MemoryStream(imageData));
wird ausreichen.Jungs, danke für deine Hilfe. Ich denke, all diese Antworten funktionieren. Ich denke jedoch, dass mein Byte-Array Rohbytes enthält. Deshalb haben all diese Lösungen für meinen Code nicht funktioniert.
Ich habe jedoch eine Lösung gefunden. Vielleicht hilft diese Lösung anderen Programmierern, die Probleme wie meine haben.
static byte[] PadLines(byte[] bytes, int rows, int columns) { int currentStride = columns; // 3 int newStride = columns; // 4 byte[] newBytes = new byte[newStride * rows]; for (int i = 0; i < rows; i++) Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride); return newBytes; } int columns = imageWidth; int rows = imageHeight; int stride = columns; byte[] newbytes = PadLines(imageData, rows, columns); Bitmap im = new Bitmap(columns, rows, stride, PixelFormat.Format8bppIndexed, Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0)); im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp");
Diese Lösung funktioniert für 8 Bit 256 bpp (Format8bppIndexed). Wenn Ihr Bild ein anderes Format hat, sollten Sie es ändern
PixelFormat
.Und im Moment gibt es ein Problem mit Farben. Sobald ich dieses Problem gelöst habe, werde ich meine Antwort für andere Benutzer bearbeiten.
* PS = Ich bin mir über den Schrittwert nicht sicher, aber für 8 Bit sollte er gleich den Spalten sein.
Und auch diese Funktion funktioniert bei mir. Diese Funktion kopiert 8-Bit-Graustufenbilder in ein 32-Bit-Layout.
public void SaveBitmap(string fileName, int width, int height, byte[] imageData) { byte[] data = new byte[width * height * 4]; int o = 0; for (int i = 0; i < width * height; i++) { byte value = imageData[i]; data[o++] = value; data[o++] = value; data[o++] = value; data[o++] = 0; } unsafe { fixed (byte* ptr = data) { using (Bitmap image = new Bitmap(width, height, width * 4, PixelFormat.Format32bppRgb, new IntPtr(ptr))) { image.Save(Path.ChangeExtension(fileName, ".jpg")); } } } }
quelle
Kann so einfach sein wie:
var ms = new MemoryStream(imageData); System.Drawing.Image image = Image.FromStream(ms); image.Save("c:\\image.jpg");
Testen Sie es aus:
byte[] imageData; // Create the byte array. var originalImage = Image.FromFile(@"C:\original.jpg"); using (var ms = new MemoryStream()) { originalImage.Save(ms, ImageFormat.Jpeg); imageData = ms.ToArray(); } // Convert back to image. using (var ms = new MemoryStream(imageData)) { Image image = Image.FromStream(ms); image.Save(@"C:\newImage.jpg"); }
quelle
static
Accessor zu häuten, aber ja, Sie möchten, dass dieseMemoryStream
in eine eingewickelt wirdusing
.System.Windows.Controls.Image
ist ein Steuerelement zum Anzeigen eines Bildes. Hier wird die KlasseSystem.Drawing.Image
verwendet.Image.FromStream
Methode kein gültiges Bild ist.Darüber hinaus können Sie einfach konvertieren
byte array
zuBitmap
.var bmp = new Bitmap(new MemoryStream(imgByte));
Sie können auch direkt
Bitmap
aus dem Dateipfad abrufen .Bitmap bmp = new Bitmap(Image.FromFile(filePath));
quelle