Создание области или графического пути из непрозрачных областей растрового изображения

#c# #bitmap #gdi #region #graphicspath

#c# #растровое изображение #gdi #область #графический путь

Вопрос:

Я хочу протестировать нарисованное растровое изображение, чтобы увидеть, видна ли данная точка в непрозрачных пикселях изображения.

Например, чтобы выполнить этот тест для всего растрового прямоугольника, вы должны сделать что-то вроде этого:

 Bitmap bitmap = new Bitmap("filename.jpg");
GraphicsPath path = new GraphicsPath();
Rectangle bitmapRect = new Rectangle(x, y, bitmap.Width, bitmap.Height);

path.AddRectangle(bitmapRect);

if (path.IsVisible(mouseLocation))
    OnBitmapClicked();
  

Однако, если у меня есть растровое изображение непрямоугольного элемента, и я хочу иметь возможность проверить, нажимают ли они на непрозрачную область, есть ли какой-либо поддерживаемый способ в .NET framework для этого?

Единственный способ, который я мог придумать, чтобы сделать это, это заблокировать байты растрового изображения в массиве и выполнить итерацию по нему, добавив каждую непрозрачную координату x, y в массив точечных структур. Затем используйте эти точечные структуры для сборки графического пути.

Поскольку эти точки будут основаны на нуле, мне нужно будет сместить местоположение мыши на расстояние между координатами x, y, по которым рисуется изображение, и 0,0. Но таким образом я мог бы по существу использовать один и тот же графический путь для каждого изображения, если я рисую его несколько раз, если изображение не искажено или не масштабировано по-разному.

Если это единственный хороший маршрут, как мне добавить точки к графическому пути? Рисовать линии от точки к точке? Нарисовать замкнутую кривую?

Ответ №1:

ИМХО более простым методом было бы посмотреть на альфа-компонент пикселя попадания:

 Color pixel = bitmap.GetPixel(mouseLocation.X, mouseLocation.Y);
bool hit = pixel.A > 0;