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 ;
was ist das format des Bildes in das bytearray? und das Letzte Beispiel, das wird nie funktionieren ... kann nicht denken, der eine ein-byte-Bild 🙂
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

Schreibe einen Kommentar