Я использую многоуровневые окна и рисую на экране прямоугольник с закругленными углами. Однако хотелось бы сгладить неровные края. Думаю, для этого мне понадобится альфа-смешивание. Есть ли способ сделать это с помощью GDI?
Как на лету создать растровое изображение с альфа-каналом с помощью GDI?
Ответы (4)
CreateDIBSection. Заполните BITMAPINFOHEADER 32bpp. Заполните альфа-канал предварительно умноженным альфа-каналом, и все готово.
AlphaBlend - это API для преобразования растровых изображений 32 бит на пиксель с каналом aplha.
Вы можете сделать это на C #, используя метод LockBits класса BitMap (см. этот вопрос для объяснения). Вы определенно не хотите использовать для этого GetPixel и SetPixel, поскольку они ужасно медленные (даже если вы будете манипулировать только краями, а не всем растровым изображением).
Есть ли шанс использовать GDI + вместо GDI? Он поддерживает сглаживание и прозрачность прямо из коробки.
CImage::AlphaBlend
- person sergiol; 09.11.2016
Нет простого способа сделать такой рисунок, используя только вызовы GDI. Вам нужно не просто альфа-смешение: вам нужно сглаживание. Обычно это включает в себя рисование того, что вы хотите, в большем разрешении, а затем уменьшение масштаба.
То, что я делал в прошлом для решения подобных проблем, - это использовать художественную программу, чтобы нарисовать любую форму, которую я хочу (например, закругленный угол), намного больше, чем мне нужно, в черно-белом режиме. Когда я хотел его нарисовать, я масштабировал черно-белое растровое изображение до любого размера, который хотел (используя вариант класс масштабирования из Code Project). Это дает мне изображение в градациях серого, которое я могу использовать в качестве альфа-канала, который затем использовал бы для альфа-смешивания, либо путем вызова функции AlphaBlend Win32, либо с помощью DIBSection и ручного изменения соответствующих пикселей.
Другой вариант этого подхода - выделить DIBSection примерно в четыре раза больше, чем вы хотели получить конечный результат, нарисовать его, а затем использовать указанный выше класс масштабирования для его уменьшения: масштабирование от большего изображения даст соответствующий эффект сглаживания .
Если все это звучит как довольно большая работа: что ж, это так.
РЕДАКТИРОВАТЬ: Чтобы ответить на заголовок этого вопроса: вы можете создать растровое изображение с альфа-каналом, вызвав CreateDIBSection. Я думаю, это само по себе не сделает того, что вы хотите.