我正在尝试使用以下代码在图像上绘制文本:
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;
因此,无论您要在画布上绘画什么,在下一次重新绘画时,它将再次绘制完整的位图,从而擦除您已经完成的工作.
如果您不想触摸位图,则需要重写timage的OnPaint事件并调用函数TextToImage(const AText:string; const aimage:timage);
总结以上是内存溢出为你收集整理的android-在图像上绘制文本全部内容,希望文章能够帮你解决android-在图像上绘制文本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)