You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中使用Graphics32显示旋转文本出现截断问题求助

解决Gr32中TImage32旋转文本被截断的问题

直接设置Font.Orientation后调用RenderText出现文本截断,核心原因是RenderText默认基于未旋转的文本边界框做裁剪,旋转后文本超出该范围的部分会被直接切掉。以下是两种可靠的解决方法:

方法一:使用坐标系旋转(推荐)

通过手动旋转画布坐标系来绘制文本,能自动适配旋转后的文本边界,彻底避免截断问题:

var
  TextContent: string;
  TextSize: TSize;
  RotateAngle: Double;
begin
  TextContent := 'PRINT TEXT AT 20 DEGREE';
  RotateAngle := 20; // 旋转角度(度数)

  // 获取未旋转时的文本尺寸
  TextSize := Image.Bitmap.TextExtent(TextContent, 3);

  Image.Bitmap.BeginUpdate;
  try
    // 保存当前画布状态
    Image.Bitmap.SaveState;
    try
      // 将坐标系原点平移到目标绘制点(100,100)
      Image.Bitmap.TranslateTransform(100, 100);
      // 旋转坐标系(转弧度,顺时针为正)
      Image.Bitmap.RotateTransform(RotateAngle * Pi / 180);
      // 平移坐标系,让文本中心对齐原目标点(可选,按需调整)
      Image.Bitmap.TranslateTransform(-TextSize.cx / 2, -TextSize.cy / 2);
      // 在旋转后的坐标系原点绘制文本
      Image.Bitmap.RenderText(0, 0, TextContent, 3, Color32(0, 0, 0, 255));
    finally
      // 恢复画布原始状态
      Image.Bitmap.RestoreState;
    end;
  finally
    Image.Bitmap.EndUpdate;
  end;
end;

方法二:手动调整裁剪区域(适配Font.Orientation)

如果坚持使用Font.Orientation,需要手动计算旋转后的文本边界,调整绘制位置或扩展裁剪区域:

var
  TextContent: string;
  TextSize: TSize;
  RotatedBounds: TRect;
begin
  TextContent := 'PRINT TEXT AT 20 DEGREE';
  Image.Bitmap.Font.Orientation := 200; // 20度旋转(注意Gr32的Orientation单位是0.1度)

  // 获取文本尺寸
  TextSize := Image.Bitmap.TextExtent(TextContent, 3);
  // 计算旋转后的文本外接矩形(需自行实现CalculateRotatedRect函数)
  RotatedBounds := CalculateRotatedRect(Point(100, 100), TextSize.cx, TextSize.cy, 20);

  // 临时扩展裁剪区域到旋转后的边界
  Image.Bitmap.ClipRect := RotatedBounds;
  // 调整绘制Y坐标,避免顶部截断
  Image.Bitmap.RenderText(100, 100 + TextSize.cy div 2, TextContent, 3, Color32(0, 0, 0, 255));
  // 恢复原裁剪区域
  Image.Bitmap.ClipRect := Image.Bitmap.Bounds;
end;

关键说明

  • Font.Orientation的单位是0.1度,设置200对应20度,但该属性仅控制文本自身旋转,不会同步调整RenderText的裁剪范围。
  • 坐标系旋转的方式更通用,能适配任意角度,且无需额外计算边界,是首选方案。

内容的提问来源于stack exchange,提问作者Normand P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:19