Ich möchte ein Byte-Array in ein Bild konvertieren.
Dies ist mein Datenbankcode, von dem ich das Byte-Array erhalte:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Mein Conversion-Code:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Wenn ich die Zeile mit einem Kommentar erreiche, tritt die folgende Ausnahme auf: Parameter is not valid.
Wie kann ich beheben, was diese Ausnahme verursacht?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
quelle
quelle
Antworten:
Sie schreiben zweimal in Ihren Speicher-Stream und entsorgen den Stream nach der Verwendung nicht. Sie fordern den Bilddecoder außerdem auf, eine eingebettete Farbkorrektur anzuwenden.
Versuchen Sie stattdessen Folgendes:
quelle
Vielleicht fehlt mir etwas, aber für mich funktioniert dieser Einzeiler gut mit einem Byte-Array, das ein Bild einer JPEG-Datei enthält.
BEARBEITEN:
Eine aktualisierte Version dieser Antwort finden Sie hier: So konvertieren Sie ein Bild in ein Byte-Array
quelle
quelle
Ich möchte darauf hinweisen, dass die von @ isaias-b bereitgestellte Lösung einen Fehler enthält.
Diese Lösung setzt voraus, dass dies der
stride
Zeilenlänge entspricht. Aber es ist nicht immer wahr. Aufgrund der von GDI durchgeführten Speicherausrichtungen kann der Schritt größer als die Zeilenlänge sein. Dies muss berücksichtigt werden. Andernfalls wird ein ungültiges verschobenes Bild generiert. Das Auffüllen von Bytes in jeder Zeile wird ignoriert.Fester Code:
Um zu veranschaulichen, wozu es führen kann, generieren wir ein
PixelFormat.Format24bppRgb
Verlaufsbild 101x101:Wenn wir das gesamte Array so kopieren, wie es ist
bmpData.Scan0
, erhalten wir das folgende Bild. Bildverschiebung, da ein Teil des Bildes in Füllbytes geschrieben wurde, wurde ignoriert. Auch deshalb ist die letzte Zeile unvollständig:Wenn wir jedoch den zeilenweisen Verschieben des Zielzeigers nach
bmpData.Stride
Wert kopieren , wird ein gültiges Bild generiert:Schritt kann auch negativ sein:
Aber ich habe nicht mit solchen Bildern gearbeitet und das ist jenseits meiner Notiz.
Verwandte Antwort: C # - RGB-Puffer von Bitmap anders als C ++
quelle
Bei allen dargestellten Antworten wird davon ausgegangen, dass das Byte-Array Daten in einer bekannten Dateiformatdarstellung enthält, z. B.: Gif, png oder jpg. Aber ich hatte kürzlich ein Problem beim Versuch,
byte[]
s, das linearisierte BGRA-Informationen enthält, effizient inImage
Objekte umzuwandeln . Der folgende Code löst es mit einemBitmap
Objekt.Dies ist eine geringfügige Variation einer Lösung, die auf dieser Website veröffentlicht wurde .
quelle
Es gibt einen einfachen Ansatz wie unten: Sie können die
FromStream
Methode eines Bildes verwenden, um den Trick auszuführen. Denken Sie daran, ihn zu verwendenSystem.Drawing
.quelle
try (UPDATE)
quelle
Sie haben returnImage nicht als irgendeine Variable deklariert :)
Dies sollte helfen:
quelle
Dies ist inspiriert von Holstebroes Antwort und Kommentaren hier: Abrufen eines Image-Objekts aus einem Byte-Array
quelle
Einzeiler:
quelle
In den meisten Fällen handelt es sich dabei um fehlerhafte Daten in der SQL-Spalte. Dies ist der richtige Weg, um in eine Bildspalte einzufügen:
Die meisten Leute machen das falsch:
quelle
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
quelle