Область из непрозрачных пикселей в C#
Пример устанавливает Region из двух элементов управления PictureBox для круговых областей. Это хорошо работает в этом примере, где изображения представляют собой круглые волейболы с прозрачным фоном, но было бы сложно вручную создать области, представляющие более нерегулярные области, такие как те, которые используются в этом примере.
В этом примере используется следующий метод автоматического создания Region, представляющий непрозрачные пиксели в растровом изображении.
// Создаем область, представляющую
// непрозрачные пиксели изображения.
public static Region MakeNonTransparentRegion(Bitmap bm)
{
if (bm == null) return null;
// Создаем область результата.
Region result = new Region();
result.MakeEmpty();
Rectangle rect = new Rectangle(0, 0, 1, 1);
bool in_image = false;
for (int y = 0; y < bm.Height; y++)
{
for (int x = 0; x < bm.Width; x++)
{
if (!in_image)
{
// Мы не находимся сейчас в непрозрачных пикселях.
if (bm.GetPixel(x, y).A != 0)
{
// Мы только начали с непрозрачных пикселей.
// Начните прямоугольник для их представления.
in_image = true;
rect.X = x;
rect.Y = y;
rect.Height = 1;
}
}
else if (bm.GetPixel(x, y).A == 0)
{
// Мы находимся в непрозрачных пикселях и
// нашли прозрачный.
// Добавим прямоугольник до области.
in_image = false;
rect.Width = (x - rect.X);
result.Union(rect);
}
}
// При необходимости добавим последний кусок прямоугольника.
if (in_image)
{
in_image = false;
rect.Width = (bm.Width - rect.X);
result.Union(rect);
}
}
return result;
}
Этот метод сначала создает пустую область Region. Затем он перебирает каждую строку в растровом изображении. Он сканирует каждую строку, строящую горизонтальные полосы непрозрачных пикселей, и добавляет прямоугольник в область, представляющую каждую полосу.
