LockBits получить пиксель (X, Y) - PullRequest
0 голосов
/ 15 октября 2018

В настоящее время у меня есть это, я ищу значение RGB (208, 94, 94) и, если есть совпадение, оно скажет моему устройству DX нарисовать на экране и также зарегистрировать его в консоли.

Ну, я не совсем уверен, как получить точные координаты X, Y пикселя.Y в порядке, и проблема не в этом, но X всегда выключен и имеет высокое значение.Как я должен получить X, Y?Есть ли формула или мой код неверен?Есть ли способ использовать GetPixel внутри LockBits с быстрой скоростью?

Например, он печатает:

x: 3772 y: 187, когда фактическое значение равно: 944, 187

x: 3888 y: 212 при фактическом значении: 973, 212

x: 3788 y: 224 при фактическом значении: 948, 224

unsafe
{
    using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap("FileName.png"))
    {

        BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
        int bytesPerPixel = System.Drawing.Bitmap.GetPixelFormatSize(bmp.PixelFormat) / 8;
        int heightInPixels = bitmapData.Height;
        int widthInBytes = bitmapData.Width * bytesPerPixel;
        byte* ptrFirstPixel = (byte*)bitmapData.Scan0;

        for (int y = 0; y < heightInPixels; y++)
        {
            byte* currentLine = ptrFirstPixel + (y * bitmapData.Stride);


            for (int x = 0; x < widthInBytes; x = x + bytesPerPixel)
            {
                int Blue = currentLine[x];
                int Green = currentLine[x + 1];
                int Red = currentLine[x + 2];

                if (Red == 208 & Green == 94 & Blue == 94)
                {
                   // Device.DrawText("Unit", TextFont, new RawRectangleF(x, y, float.MaxValue, float.MaxValue), UnitTextBrush);

                    Console.WriteLine($"x: {x} y: {y}");

                    break;
                }
            }
        }

        bmp.UnlockBits(bitmapData);
    }
}
...