Delphi: альфа-канал смешивания GR32 зависит от цвета Clear()

Я использовал изображение с альфа-каналом, и некоторые части изображения не полностью непрозрачны. Когда я рисую это на TImgView32 возражать, что разделы получают немного цвета от Clear() цвет. Давайте покажем это на примере изображения:

Это оригинальное изображение, которое вы обычно видите в Photoshop:

И это изображение результата, когда я рисую его на новом слое в объекте GR32, который я очищал раньше Clear($00FF0000);:

Результат прозрачный, как в фотошопе, но проблема в красном ореоле.

Или другой цвет с Clear($000000FF);:

Обратите внимание, что, как вы знаете, цвет, который я использовал, полностью прозрачен.

Вот код, который я использовал для создания результата выше:

begin
  ImageList.Bitmaps.Add;     //ImageList is a TBitmap32List object
  LoadPNGintoBitmap32(ImageList.Bitmap[0], ImgPath+'test.png', DummyBool);

  BL:= TBitmapLayer.Create(ImgView.Layers);
  ImgID:=0;
  ScaleFactor:= 1;
  LayerPos:= Point(100, 100);

  with ImageList.Bitmap[ImgID] do
    ImageRect:= Rect(0, 0, Width, Height);

  {Auxilary variables}
  CanvasWidth:= ImageRect.Right{*2};   //Extending width for two icon.
  CanvasHeight:= ImageRect.Bottom;

  BL.Location:= FloatRect(
    LayerPos.X,
    LayerPos.Y,
    LayerPos.X + CanvasWidth * ScaleFactor,
    LayerPos.Y + CanvasHeight * ScaleFactor
  );

  with BL.Bitmap do
  begin
    {Init}
    SetSize(CanvasWidth, CanvasHeight);
    DrawMode:= dmBlend;
    Clear($00FF0000);

    {Insert image}
    Draw(0, 0, ImageRect, ImageList.Bitmap[ImgID]);
  end;

  if ScaleFactor<>1 then
    TDraftResampler.Create(BL.Bitmap);  //BL.Bitmap, because we used "Draw" method
end;

Как избежать этого и получить четкий результат, как в фотошопе?

2 ответа

Решение

Насколько я вижу, он работает как задумано, если вы используете cmBlend режим комбинирования. cmBlend не учитывает альфа-фон и, как указывается в документации, не должен использоваться для смешивания растровых изображений:

cmBlend - Быстрое смешивание цвета переднего плана с цветом фона, используя предоставленную альфа. Этот метод не подходит для работы и сохранения альфа-каналов. Используйте это больше, если вы хотите смешать непосредственно с буфером отображения.

Использовать cmMerge вместо этого комбинируйте режим, когда важны и передний план, и фоновый альфа.

У меня недавно была похожая проблема

TImageList не поддерживает прозрачность, поэтому мне пришлось использовать TPngImageList, когда я хотел загрузить прозрачные изображения PNG в элементы управления во время выполнения.

TPngImageList доступен через поиск Google!

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