Wie im Betreff steht, habe ich ein .bmp
-Bild und ich brauche einen Code, der in der Lage ist, die Farbe eines beliebigen Pixels des Bildes zu erhalten. Es handelt sich um ein 1bpp (indexiertes) Bild, daher wird die Farbe entweder schwarz oder weiß sein. Hier ist der Code, den ich derzeit habe:
//Diese Methode sperrt die Bits einer Pixellinie
private BitmapData LockLine(Bitmap bmp, int y)
{
Rectangle lineRect = new Rectangle(0, y, bmp.Width, 1);
BitmapData line = bmp.LockBits(lineRect,
ImageLockMode.ReadWrite,
bmp.PixelFormat);
return line;
}
//Diese Methode nimmt die BitmapData einer Pixellinie
//und gibt die Farbe eines Pixels zurück, der die benötigte x-Koordinate hat
private Color GetPixelColor(BitmapData data, int x)
{
//Ich bin mir nicht sicher, ob diese Zeile korrekt ist
IntPtr pPixel = data.Scan0 + x;
//Der folgende Code funktioniert für ein 24bpp-Bild:
byte[] rgbValues = new byte[3];
System.Runtime.InteropServices.Marshal.Copy(pPixel, rgbValues, 0, 3);
return Color.FromArgb(rgbValues[2], rgbValues[1], rgbValues[0]);
}
Aber wie kann ich es für ein 1bpp-Bild zum Laufen bringen? Wenn ich nur ein Byte vom Zeiger lese, hat es immer den Wert 255
, also gehe ich davon aus, dass ich etwas falsch mache.
Bitte schlagen Sie nicht vor, die Methode System.Drawing.Bitmap.GetPixel
zu verwenden, da sie zu langsam ist und ich möchte, dass der Code so schnell wie möglich funktioniert. Vielen Dank im Voraus.
BEARBEITEN: Hier ist der Code, der funktioniert, falls jemand ihn benötigt:
private Color GetPixelColor(BitmapData data, int x)
{
int byteIndex = x / 8;
int bitIndex = x % 8;
IntPtr pFirstPixel = data.Scan0+byteIndex;
byte[] color = new byte[1];
System.Runtime.InteropServices.Marshal.Copy(pFirstPixel, color, 0, 1);
BitArray bits = new BitArray(color);
return bits.Get(bitIndex) ? Color.Black : Color.White;
}