我使用带有alpha通道的图片,而某些图像部分并非完全不透明。当我在TImgView32
对象上绘制时,这些部分从Clear()
颜色获得一点颜色。让我们通过样本图片展示它:
这是您通常在Photoshop中看到的原始图片:
这是我在GR32对象中的新图层上绘制的结果图像,我之前使用Clear($00FF0000);
清除了它:
结果像photohop一样透明但红色光环就是问题。
或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;
如何避免这种情况并获得像photoshop一样清晰的结果?
答案 0 :(得分:1)
据我所知,只要您使用cmBlend
combine mode,它就可以按设计运行。 cmBlend
不会考虑背景的alpha值,而且the documentation个状态不应该用于混合位图:
cmBlend - 使用提供的alpha快速混合前景色和背景色。此方法不适用于工作和保留alpha通道。如果要直接混合到显示缓冲区,请使用此更多。
当前景和背景alpha都很重要时,请使用cmMerge
组合模式。
答案 1 :(得分:0)
我最近遇到过类似的问题
TImageList不支持透明度,所以当我想在运行时将透明png图像加载到控件中时,我不得不使用TPngImageList。
TPngImageList可通过谷歌搜索获得!