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.
相关产品推荐
相关产品推荐

