Как читать пиксели в четырех углах BitmapSource?

У меня есть объект.NET BitmapSource. Я хотел бы прочитать четыре пикселя в углах растрового изображения и проверить, все ли они темнее белого. Как я могу это сделать?

Изменить: я не против преобразования этого объекта в другой тип с лучшим API.

1 ответ

Решение

BitmapSource имеет метод CopyPixels, который можно использовать для получения одного или нескольких значений пикселей.

Вспомогательный метод, который получает значение одного пикселя по заданной координате пикселя, может выглядеть так, как показано ниже. Обратите внимание, что, возможно, его необходимо расширить для поддержки всех необходимых форматов пикселей.

public static Color GetPixelColor(BitmapSource bitmap, int x, int y)
{
    Color color;
    var bytesPerPixel = (bitmap.Format.BitsPerPixel + 7) / 8;
    var bytes = new byte[bytesPerPixel];
    var rect = new Int32Rect(x, y, 1, 1);

    bitmap.CopyPixels(rect, bytes, bytesPerPixel, 0);

    if (bitmap.Format == PixelFormats.Bgra32)
    {
        color = Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]);
    }
    else if (bitmap.Format == PixelFormats.Bgr32)
    {
        color = Color.FromRgb(bytes[2], bytes[1], bytes[0]);
    }
    // handle other required formats
    else
    {
        color = Colors.Black;
    }

    return color;
}

Вы бы использовали метод следующим образом:

var topLeftColor = GetPixelColor(bitmap, 0, 0);
var topRightColor = GetPixelColor(bitmap, bitmap.PixelWidth - 1, 0);
var bottomLeftColor = GetPixelColor(bitmap, 0, bitmap.PixelHeight - 1);
var bottomRightColor = GetPixelColor(bitmap, bitmap.PixelWidth - 1, bitmap.PixelHeight - 1);
Другие вопросы по тегам