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.
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
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
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.