gpt4 book ai didi

android - 在图像上绘制文字

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:33 25 4
gpt4 key购买 nike

我正在尝试使用以下代码在图像上绘制文本:

procedure TfMain.TextToImage(const AText: string; const AImage: TImage);
begin
if NOT Assigned(AImage) then Exit;
AImage.Canvas.BeginScene;
AImage.Canvas.Font.Size := 18;
AImage.Canvas.Font.Family := 'Arial';
AImage.Canvas.Fill.Color := TAlphaColorRec.Dodgerblue;
AImage.Canvas.Font.Style := [TFontStyle.fsbold];
AImage.Canvas.FillText( AImage.AbsoluteRect,
AText,
False,
1,
[TFillTextFlag.RightToLeft],
TTextAlign.taCenter,
TTextAlign.taCenter);
AImage.Canvas.EndScene;
end;

问:为什么上面的程序在windows上可以用,在android上不行?

最佳答案

尝试直接在 timage 的 TBitmap 上绘制,而不是在 TImage 的 Canvas 上绘制。

在尝试访问图像之前,您还需要创建图像的位图:

AImage.Bitmap := TBitmap.Create(Round(AImage.Width), Round(AImage.Height));

所以正确的代码应该是这样的:

procedure TfMain.TextToImage(const AText: string; const AImage: TImage);
begin
if NOT Assigned(AImage) then Exit;
AImage.Bitmap := TBitmap.Create(Round(AImage.Width), Round(AImage.Height));
AImage.Bitmap.Canvas.BeginScene;
try
//....
// Use AImage.Bitmap.Canvas as needed
AImage.Bitmap.Canvas.FillText( AImage.AbsoluteRect,
AText,
False,
1,
[],
TTextAlign.Center,
TTextAlign.Center);
finally
AImage.Bitmap.Canvas.EndScene;
end;
end;

TImage.Paint 事件代码中您将看到:

procedure TImage.Paint;
var
R: TRectF;
begin
if (csDesigning in ComponentState) and not Locked and not FInPaintTo then
begin
R := LocalRect;
InflateRect(R, -0.5, -0.5);
Canvas.DrawDashRect(R, 0, 0, AllCorners, AbsoluteOpacity, $A0909090);
end;

UpdateCurrentBitmap;
if FCurrentBitmap <> nil then
DrawBitmap(Canvas, LocalRect, FCurrentBitmap, AbsoluteOpacity);
end;

因此无论您要在 Canvas 上绘制什么,在下一次重绘时它都会再次绘制完整的位图并删除您已经完成的内容。

如果您不想触摸位图,那么您需要重写TImageOnPaint 事件并调用function TextToImage(const AText: string ; const AImage: TImage);

关于android - 在图像上绘制文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42302190/

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