如何获取经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
相关产品推荐
相关产品推荐

