Мне (и другим тоже) почему-то казалось, что функция AplhaBlend() должна брать обычное сырое (raw) RGBA изображение и рисовать его с учетом прозрачности. И я долго не мог понять, почему точки с A=0 и с A=255 рисуются нормально, а все остальное - неправильно (получается очень белое).
Оказывается, нужно заранее самостоятельно наложить альфа-канал на картинку, типа такого:
bgra_pixel *It(Bits);
for (int Left = Width * Height; Left; --Left, ++It)
{
It->blue = ((unsigned)It->blue * It->alpha) >> 8;
It->green = ((unsigned)It->green * It->alpha) >> 8;
It->red = ((unsigned)It->red * It->alpha) >> 8;
}
1 комментарий:
Eto ne bug - eto standard, nazivaetsia: premultiplied alpha
Ispolzuetsia v bolshinstve sistem s alpha composition (v tom cisle v OS, takih kak Windows, Mac OSX)...
Da MS dalek do sovershenstva no tam gde greha net pridumivat' ego vseje nenujno...
Отправить комментарий