Delphi:GR32混合alpha通道依赖于Clear()颜色

时间:2015-03-04 06:47:06

标签: delphi blending graphics32

我使用带有alpha通道的图片,而某些图像部分并非完全不透明。当我在TImgView32对象上绘制时,这些部分从Clear()颜色获得一点颜色。让我们通过样本图片展示它:

这是您通常在Photoshop中看到的原始图片:

enter image description here

这是我在GR32对象中的新图层上绘制的结果图像,我之前使用Clear($00FF0000);清除了它:

enter image description here

结果像photohop一样透明但红色光环就是问题。

Clear($000000FF);的其他颜色:

enter image description here

请注意,您知道我使用的颜色是完全透明的。

以下是我用于创建上述结果的代码:

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;

如何避免这种情况并获得像photoshop一样清晰的结果?

2 个答案:

答案 0 :(得分:1)

据我所知,只要您使用cmBlend combine mode,它就可以按设计运行。 cmBlend不会考虑背景的alpha值,而且the documentation个状态不应该用于混合位图:

  

cmBlend - 使用提供的alpha快速混合前景色和背景色。此方法不适用于工作和保留alpha通道。如果要直接混合到显示缓冲区,请使用此更多。

当前景和背景alpha都很重要时,请使用cmMerge组合模式。

答案 1 :(得分:0)

我最近遇到过类似的问题

TImageList不支持透明度,所以当我想在运行时将透明png图像加载到控件中时,我不得不使用TPngImageList。

TPngImageList可通过谷歌搜索获得!