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

如何获取经Graphics变换后旋转图像的位置与尺寸?

旋转图像后获取包围矩形的实现

先明确你的绘制逻辑:你先将坐标系平移到(BaseX, BaseY),再旋转Rotation角度,最后在平移后的坐标系中绘制图像,图像左上角坐标为(X - BaseX, Y - BaseY)。要获取旋转后图像的位置与尺寸,需要计算图像四个顶点在原始坐标系中的实际位置,再推导最小包围矩形。

实现代码

using System.Drawing;
using System.Linq;

public Rectangle ToRotatedRectangle()
{
    // 将角度转换为弧度
    double radian = Rotation * Math.PI / 180;
    double cos = Math.Cos(radian);
    double sin = Math.Sin(radian);

    // 图像在变换后坐标系中的四个顶点
    PointF[] transformedPoints = new PointF[]
    {
        new PointF(X - BaseX, Y - BaseY), // 左上角
        new PointF(X - BaseX + Image.Width, Y - BaseY), // 右上角
        new PointF(X - BaseX, Y - BaseY + Image.Height), // 左下角
        new PointF(X - BaseX + Image.Width, Y - BaseY + Image.Height) // 右下角
    };

    // 将变换后的顶点转换回原始坐标系(先旋转,再平移回BaseX/BaseY)
    PointF[] originalPoints = transformedPoints.Select(p => new PointF(
        (float)(p.X * cos - p.Y * sin + BaseX),
        (float)(p.X * sin + p.Y * cos + BaseY)
    )).ToArray();

    // 计算包围矩形的边界值
    float minX = originalPoints.Min(p => p.X);
    float minY = originalPoints.Min(p => p.Y);
    float maxX = originalPoints.Max(p => p.X);
    float maxY = originalPoints.Max(p => p.Y);

    // 返回旋转后的包围矩形(取整适配Rectangle的整数参数)
    return new Rectangle((int)Math.Round(minX), (int)Math.Round(minY), 
                         (int)Math.Round(maxX - minX), (int)Math.Round(maxY - minY));
}

核心逻辑说明

  • 旋转计算严格匹配你的Graphics变换顺序:先对平移后的顶点执行绕原点旋转,再平移回原始坐标系的(BaseX, BaseY)位置。
  • 通过四个顶点的极值推导包围矩形,同时得到正确的左上角位置和旋转后的实际尺寸。
  • 若需要更精确的浮点数坐标,可将返回类型改为RectangleF,去掉Math.Round处理。

内容的提问来源于stack exchange,提问作者Flexan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:55:21