Anzeigen eines byte-array in eine pictureBox in C#
Ich lese eine Menge Fragen und Antworten, die meisten empfehlen:
byte[] byteArray; //(contains image data)
MemoryStream stream = new MemoryStream(byteArray);
Bitmap image = new Bitmap(stream);
pictureBox.Image = image;
oder mehr direkt:
pictureBox.Image = Image.FromStream(stream);
Bekomme ich immer :"Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in System.Drawing.dll
Zusätzliche Informationen: der Parameter ist nicht gültig."
in Bezug auf die stream-parameter.
Selbst in den Fällen, in denen:
byte[] byteArray = new byte[1];
byteArray[0] = 255;
Ich kann nicht herausfinden, warum.
EDIT:
Bekomme ich die Daten aus einer Datei wie dieser:
//byteArray is defined as List<byte> byteArray = new List<byte>();
TextReader tr = new StreamReader(file);
string File = tr.ReadToEnd();
string[] bits = File.Split('\t');
List<string> image = new List<string>(bits);
height = int.Parse(bits[0]);
width = int.Parse(bits[1]);
image.RemoveRange(0, 2);
image.RemoveAt(image.Count - 1);
foreach (string s in image)
{
byteArray.Add(byte.Parse(s));
}
return byteArray //(i do .ToArray() in the MemoryStream call);
Im debugger sehe ich also, dass das byteArray ist in Ordnung, count = 2244, Werte überall, etc.
EDIT #2: Sample data-Datei (erstes byte[0] ist die Höhe, das zweite byte[1] ist die Breite, der rest ist die RGB-Daten)
47 15 12 55 25 52 55 25 52 55 25 52 55 25 52 55
25 52 55 25 52 55 25 52 55 25 52 55 25 52 55 25
52 55 25 52 55 25 52 55 25 52 55 25 52 55 25 52
55 25 52 55 25 52 55 25 52 55 25 52 55 25 52 55
25 52 51 24 82 49 24 82 49 24 92 50 25 12 50 24
92 48 24 92 50 24 82 50 25 02 50 24 92 50 25 02
51 25 12 50 24 92 49 25 02 50 25 02 49 25 12 49
25 02 49 25 02 47 25 12 47 25 22 50 24 82 47 24
82 50 24 72 50 24 82 49 24 82 50 24 72 50 24 82
50 24 72 49 24 82 49 25 22 52 24 92 50 24 82 50
24 72 47 25 00 etc.
EDIT #3: LÖSUNG
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
Marshal.Copy(byteArray, 0, ptr, height * width * 3);
bmp.UnlockBits(bmpData);
pictureBox.Image = bmp;
Überprüfen müssen 4 byte-Ausrichtung, so be-Funktion ist nun:
TextReader tr = new StreamReader(file);
string File = tr.ReadToEnd();
string[] bits = File.Split('\t');
List<string> image = new List<string>(bits);
height = int.Parse(bits[0]);
width = int.Parse(bits[1]);
int falseBits = 0;
int oldWidth = width;
while (width % 4 != 0)
{
width++;
falseBits++;
}
int size = height * width * 3;
byte[] byteArray = new byte[size];
Parallel.For(0, size - 1, i => byteArray[i] = 255);
int index = 0;
int lineIndex = 0;
image.RemoveRange(0, 2);
image.RemoveAt(image.Count - 1);
foreach (string s in image)
{
byteArray [index] = byte.Parse(s);
byteArray [index + 1] = byteArray [index];
byteArray [index + 2] = byteArray [index];
index +=3;
lineIndex++;
if (lineIndex == oldWidth)
{
lineIndex = 0;
index += 3*falseBits;
}
}
return byteArray ;
Das byte[] Daten, die nicht wohlgeformt sind, dann.
das Letzte Beispiel ist nur zu sagen, dass der stream nicht funktionieren, auch wenn ich weiß, dass die Daten wohlgeformt sind, wie leppie gesagt, ich werde Bearbeiten, und schreiben Sie ein Beispiel für die Daten, die ich habe
Könnten Sie uns zeigen, ein Beispiel-Datendatei?
Daten bedeuten die aktuellen RGB-Farbwerte für jedes pixel? Wie viele bytes werden für ein pixel? Oder hat die Daten enthalten auch einen header (z.B. eine bitmap-header)?
InformationsquelleAutor Smash | 2012-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedes Bild braucht eine Beschreibung, was der Inhalt des byte-Arrays. Diese Beschreibung wird dem sogenannten Header. Wenn Sie nun wollen, den Austausch der bytes, die Sie brauchen, um zu vermeiden, ändern Sie den header.
http://en.wikipedia.org/wiki/BMP_file_format
Ist eine Probe meiner sourcecode während der Arbeit mit solch einem ByteArray
InformationsquelleAutor Nasenbaer
Folgenden Ihre ursprüngliche Vorschlag an der Spitze der post, ich habe keine problem mit dieser Arbeit.
Nun, ob oder nicht, das ist sicher/korrekt ist, weiß ich nicht, aber es scheint zu funktionieren.
Vielleicht ReadToEnd nicht das zurück, was Sie denken, es gibt? Haben Sie versucht, zu Lesen in einem Puffer?
InformationsquelleAutor Jesse