Альфа-канал в DeviceContext (HDC)

Пожалуйста, помогите мне с альфа-каналом в HDC. Я делаю HDC DC бросить CreateCompatibleDC. Затем вызвать CreateDIBSection и найти байты изображения в памяти. Затем вызовите DrawFrameControl для этого постоянного тока. Все работает, но в памяти есть 4 байта на пиксель, а альфа-канал заполняется на 00. Даже если раньше были FF. Но мне нужен альфа-канал. Как я могу заставить DrawFrameControl устанавливать реальные альфа-значения или просто не трогать их? Спасибо. И извините за плохой английский:(

1 ответ

Решение

Вы не можете заставить GDI не записывать в альфа / зарезервированный байт растрового изображения размером четыре байта на пиксель. GDI в действительности не поддерживает альфа, за исключением нескольких функций, таких как AlphaBlend, Тем не менее, вы можете использовать знания, которые он записывает, и сбрасывать альфа в 0, чтобы узнать, в какие пиксели он записал, и впоследствии вручную исправить альфу.

Для получения дополнительной информации прочитайте эти три статьи:

Первые два, вероятно, дают вам достаточно информации, чтобы достичь того, что вы хотите.

В этих статьях используется общий подход к обработке альфы с помощью функций GDI, путем сканирования пикселей, где альфа-объект был перекрыт, и его исправления (и рассматриваются более продвинутые методы рисования нескольких вещей друг над другом с правильной альфа-версией). FrameRect рисует прямоугольник, где линии имеют ширину и высоту в одну единицу. Вы можете найти более эффективным рисование с использованием линий или даже непосредственное редактирование растрового изображения в памяти для рисования прямых линий в памяти. Это исключает необходимость сканирования всего растрового изображения на предмет пикселей, отрисованных с помощью GDI- в конце концов, поскольку это прямоугольник с ребрами шириной в одну единицу, вы точно знаете, к каким пикселям уже будет нарисовано изображение, и можете редактировать их самостоятельно.

Другие вопросы по тегам