Laden...

[gelöst] Pixelwerte auslesen

Erstellt von mosspower vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.554 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren
[gelöst] Pixelwerte auslesen

Hallo Kollegen,

ich gebe jetzt einfach genervt auf, und probiere es auf diesem Wege. Ich habe vorher noch nie etwas mit Bildbearbeitungen gemacht, daher vielleicht auch mein Problem, ich schnalle es einfach nicht.

Der Quellcode:

  bool printOld = false;
  Bitmap bitmap = new Bitmap("C:/tester.bmp");
  byte[,] image = new byte[bitmap.Width, bitmap.Height];

  Console.WriteLine(bitmap.PixelFormat.ToString() + Environment.NewLine);

  if(!printOld) {
    Rectangle rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
        
    for(int i = 0; i < bitmap.Height; i++) {
      for(int j = 0; j < bitmap.Width; j++) {
        Color color = bitmap.GetPixel(j, i);
        Console.Write("[{0,3},{0,3},{0,3}] ", color.R, color.G, color.B);
      }

      Console.WriteLine();
    }

    Console.WriteLine("GetPixel took [" +
      DateUtil.GetTimeSpanForNow(start).TotalMilliseconds + "]\n");
    start = DateTime.Now;

    BitmapData bitmapData = bitmap.LockBits(rectangle, 
    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

    int stride = bitmapData.Stride;
    int totalLength = bitmapData.Width * bitmapData.Height * 3 /* Hardcoded for  24 bpp */;
    byte[] pixelInfo = new byte[totalLength];
    Marshal.Copy(bitmapData.Scan0, pixelInfo, 0, totalLength);

    for(int i = 0; i < pixelInfo.Length; i += 3) {
      Console.Write("[");
      Console.Write("{0,3},", + pixelInfo[i]);
      Console.Write("{0,3},", + pixelInfo[i + 1]);
      Console.Write("{0,3}", + pixelInfo[i + 2]);

      if(i != 27) {
        Console.Write("] ");
      }

      if(i == 12) {
        Console.WriteLine();
      }    
    }

    Console.Write("]\n");
    Console.WriteLine("Mem / Ptr took [" + 
    DateUtil.GetTimeSpanForNow(start).TotalMilliseconds + "]\n");

Die Ausgabe:

Format24bppRgb

[  0,  0,  0] [  0,  0,  0] [  0,  0,  0] [255,255,255] [255,255,255]
[255,255,255] [255,255,255] [255,255,255] [  0,  0,  0] [  0,  0,  0]
GetPixel took [0]

[  0,  0,  0] [  0,  0,  0] [  0,  0,  0] [255,255,255] [255,255,255]
[  0,255,255] [255,255,255] [255,255,255] [255,  0,  0] [  0,  0,  0]
Mem / Ptr took [0]

Thread done

Die Pixel passen einfach nicht, was mache ich falsch? Das Bild besteht definitiv aus 24 bpp X( ... und wie gehe ich (in Zukunft) vor, wenn ich nur 1bpp habe?

Danke schon mal für eure Hilfe.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mosspower,

Die Pixel passen einfach nicht, was mache ich falsch? Das Bild besteht definitiv aus 24 bpp

vermutlich auf der Platte, aber vielleicht hat es im Speicher 32 bit.

und wie gehe ich (in Zukunft) vor, wenn ich nur 1bpp habe?

Dann hast du 8 Pixel pro Byte.

herbivore

309 Beiträge seit 2007
vor 16 Jahren

Kann es sein, dass du das "Stride" übersehen hat ???

Die Bytes pro Zeile werden immer auf einen durch 4 teilbaren Wert aufgefüllt.
Dazu gibt es im BitmapData die "Stride"-Eigenschaft.

mfg Hajoseb

**"Zufall ist das Pseudonym Gottes, wenn er nicht selbst unterschreiben will.” **
Anatole France

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Ja, die Breite des Bildes war nicht ohne Rest durch vier teilbar, deshalb habe ich vergessen, den "Schrott" in Stride wegzulassen. Aber, ein Tag später ist man halt schlauer.

@herbivore,

danke, das mit den 1bpp hat funktioniert, obwohl es schon komisch ist, dass wenn man z.B. ein Bild mit 4 Pixeln Breite hat, das Stride gleich 4 Bytes! lang ist obwohl man in einer Zeile nur ein halbes benötigt.