我正在尝试绘制一个源图像(GR32 TBitmap32),它在正常(TBitmap)图像上包含一些完全透明和部分透明的像素,同时保留源图像中的透明度。
我用这个:
BMP32.DrawTo(BMP.Canvas.Handle, 0, 0);
Run Code Online (Sandbox Code Playgroud)
但图像不是透明绘制的。
代码:
一切都很基本:我有一个背景位图 (Bkg),在应用程序启动时,我在其中加载了一个图像。然后在应用程序中,我从磁盘加载第二张图像(具有透明度的图像)并将其绘制在背景上。
var Bkg: TBitmap;
procedure TfrmPhoto.FormCreate(Sender: TObject);
begin
Bkg:= LoadGraphEx(GetAppDir+ 'bkg.bmp'); { Load bitmap from file }
{
Bkg.Transparent:= TRUE;
Bkg.PixelFormat:= pf32bit;
Bkg.TransparentColor:= clPink;
}
end;
procedure TfrmPhoto.Apply2;
VAR
Loader: TBitmap;
BMP32: tbitmap32;
begin
BMP32:= TBitmap32.Create;
TRY
Loader:= TBitmap.Create;
TRY
Loader.LoadFromFile('c:\Transparent.BMP');
BMP32.Assign(Loader);
FINALLY
FreeAndNil(Loader);
END;
{ Mix images }
BMP32.DrawTo(Bkg.Canvas.Handle, 0, 0); <----- The problem is here
imgPreview.Picture.Assign(Bkg); { This is a TImage where I see the result }
FINALLY
FreeAndNil(BMP32);
END;
end;
Run Code Online (Sandbox Code Playgroud)
它与 TransparentBlt() 一起工作(但有两个缺点)。
我对 TransparentBlt 处理半透明像素(旋转图像的边缘)的方式不满意。将 src 图像合并到背景中后,边缘看起来很糟糕。
为了使用 TransparentBlt,我必须将源图像中的颜色 (clPink) 定义为透明。这意味着如果源图像中有一些粉红色,结果将看起来非常糟糕(它将被视为透明)。让我们为非粉红色的图像祈祷!
如果您找到一种将图像(同时保持透明度)直接从 Bitmap32 传输到背景的方法,请发帖,我会接受您的回答!
我在这里看到的一个解决方案(仍然是一个黑客)是处理 TBitmap32 中的所有内容,然后将最终结果“导出”为 TBitmap。我明天试试这个。
更新:
解决方案:
这是在保留透明度的同时合并两个 TBitmap32 图像的方法:
Dst.CombineMode:= cmBlend;
Dst.DrawMode:= dmBlend;
Src.Draw(0, 0, Dst);
Run Code Online (Sandbox Code Playgroud)
Dst 和 Src 是 TBitmap32 图像。它不适用于 TBitmap。