gpt4 book ai didi

delphi - 将包含文本的半透明位图与 Graphics32 混合

转载 作者:行者123 更新时间:2023-12-03 15:21:55 25 4
gpt4 key购买 nike

我正在尝试在我们的内部组件之一内实现分层绘画系统,但在混合包含文本的位图时遇到问题。

以下代码片段显示了问题:

uses
GR32;

procedure DrawBitmaps;
var
bmp1: TBitmap32;
bmp2: TBitmap32;
begin
bmp1 := TBitmap32.Create;
bmp1.Width := 100;
bmp1.Height := 100;
bmp1.FillRect(0, 0, 100, 100, clWhite32);
bmp1.FillRect(0, 0, 80, 80, clTrGreen32);

bmp1.Font.Size := -16;
bmp1.Font.Color := clBlack;
bmp1.TextOut(2, 10, 'Green');

bmp1.SaveToFile('c:\0\bmp1.bmp');

bmp2 := TBitmap32.Create;
bmp2.Width := 80;
bmp2.Height := 80;
bmp2.FillRect(0, 0, 80, 80, clTrRed32);

bmp2.Font.Size := -16;
bmp2.Font.Color := clBlack;
bmp2.TextOut(2, 50, 'Red');

bmp2.SaveToFile('c:\0\bmp2.bmp');

bmp2.DrawMode := dmBlend;
bmp2.DrawTo(bmp1, 20, 20);

bmp1.SaveToFile('c:\0\bmpcombined.bmp');

bmp1.Free;
bmp2.Free;
end;

生成的图像:

bmp1:bmp1bmp2:bmp2bmp组合:combined

如您所见,文本在 bmpbmp2 上绘制为黑色,但在 bmpcombined 上显示为白色。

我猜测问题在于TextOut,它映射到Windows.ExtTextOut(通过GR32_Backends_VCL.pasTGDIBackend。文本输出)。该方法不处理透明度并使用 alpha 00 绘制文本(颜色为 $000000 而不是 $FF000000)。

作为快速解决方案,将 bmp2.Font.Color 设置为 $FF000000 没有帮助。

bmp2.Font.Color := TColor(clBlack32);

我正在使用来自 GitHub 的新鲜来源

我应该如何在半透明背景上绘制不透明文本,以便将其混合成更大的图片?

最佳答案

据我记得,TextOut 函数只是作为向位图添加一些文本的直接方法,缺少您上面提到的所有修复。

为了保持对透明度的完全控制,您可能需要使用

procedure TBitmap32.RenderText(X, Y: Integer; const Text: string; AALevel: Integer; Color: TColor32);

相反。

它使用了您在自己的答案中提到的技术,但级别更复杂。它还允许您使用抗锯齿(基于过采样),但今天实际上不建议使用除字体引擎输出之外的任何其他抗锯齿技术(以充分利用字体提示)。

由于您使用的是最新的源代码,您还可以考虑使用 VPR 来呈现文本(请参阅示例“TextVPR”)。它将文本的轮廓转换为矢量,并使用 Graphics32 的矢量绘图功能(默认使用“VPR”引擎,因此得名)将其渲染到屏幕上。还有一个精简的 AGG 引擎,它本身基于 FreeType1 引擎,对于字体来说可能会稍微快一些。

说到性能:请记住,除 TextOut 之外的所有其他方法都会明显降低性能。因此,如果您的目标是高性能,最好编写自己的代码(基于 TextOut)。

否则,TextVPR 方法将为您提供更多自由,尤其是在填充文本(例如使用渐变)或将文本转换为曲线等时。

关于delphi - 将包含文本的半透明位图与 Graphics32 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44368298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com