Проблем със StretchDIBits

Искам да направя 32-битово изображение (PNG с алфа канал) върху 32-битово растерно изображение (или Bitmap32).

Не знам как да кажа на функцията да смеси изображението, вместо да го бледи. Подобно на използването на AlphaBlend вместо BitBlt, трябва да накарам тази функция да смесва изображение вместо обикновен блит.

Това е моят пример:

ABitmap е тип TBitmap32 (GR32), но същият резултат е с обикновен TBitmap с 32-битова палитра.

    ABitmap.SetSize(GetWidth, GetHeight);
    SetStretchBltMode(ABitmap.Handle, COLORONCOLOR);//HALFTONE);
    ABitmap.Clear($FFFFFFFF);  { Here I try to erase background with white color, so that new image is blit over white surface }
    StretchDIBits(
      ABitmap.Handle,
      0, 0,
      GetWidth, GetHeight,
      0, 0,
      GetWidth, GetHeight,
      FreeImage_GetBits(Dib),
      FreeImage_GetInfo(Dib)^,
      DIB_RGB_COLORS,
      SRCCOPY);    // --- SRCAND etc. produce not good results

FreeImage_GetBits и FreeImage_GetInfo са библиотечни функции на FreeImage, които сочат към началото на битовия масив и сочат към структурата.

Каквото и да правя StretchDBit не позволява смесване.


person Ivan Mark    schedule 10.05.2012    source източник


Отговори (1)


StretchDIBits() няма концепция за алфа смесване. Първо ще трябва да изтриете вашия PNG до временно 32-битово растерно изображение, като се уверите, че сте настроили неговия алфа канал, както е необходимо, и след това AlphaBlend() временното растерно изображение върху вашето целево растерно изображение. Или можете просто да AlphaBlend() PNG директно към растерното изображение на местоназначението, ако PNG вече е разположено в паметта с помощта на 32-битово растерно изображение.

person Remy Lebeau    schedule 11.05.2012
comment
Цялата концепция за алфа смесване е чужда на повечето GDI функции. Беше включен много късно в играта. - person Mark Ransom; 11.05.2012
comment
Вярно. Дори по-късно в играта методът TCanvas.Draw() на VCL само през последната година или две най-накрая получи поддръжка за алфа-смесване чрез AlphaBlend() при рисуване на растерни изображения. - person Remy Lebeau; 11.05.2012
comment
Функцията AlphaBlend очаква Canvas.Handle (HDC) вместо масив от памет. Това е функция DDB, а не DIB (Device Independed Bitmap). Търся някаква DIB функция за смесване. - person Ivan Mark; 12.05.2012
comment
AlphaBlend() работи с DIB. Собственият пример на Microsoft показва използването на DIB. - person Remy Lebeau; 12.05.2012