如何裁剪带有旋转矩形的图像?
Posted
技术标签:
【中文标题】如何裁剪带有旋转矩形的图像?【英文标题】:How to crop an image with a rotated rectangle? 【发布时间】:2013-03-29 20:41:20 【问题描述】:我有一个 System.Drawing.Bitmap
形式的图像和一个 4 点形式的矩形(Vector2
s 可以简单地转换为 PointF
s)。
我想使用这些点来裁剪图像的一部分。我发现this answer 非常接近我想要的,但我不确定如何从中得到正确的矩阵。
这是我目前所得到的:
protected static Bitmap CropImage(Bitmap src, Vector2[] rect)
var width = (rect[1] - rect[0]).Length;
var height = (rect[3] - rect[0]).Length;
var result = new Bitmap(M2.Round(width), M2.Round(height));
using (Graphics g = Graphics.FromImage(result))
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
using (Matrix mat = new Matrix())
// ????
return result;
如何从我的矩形中得到正确的变换矩阵?
【问题讨论】:
【参考方案1】:这将与链接答案中的相同,但不是:
mat.Translate(-rect.Location.X, -rect.Location.Y);
mat.RotateAt(angle, rect.Location);
你会使用:
double angle = Math.Atan2(rect[1].Y - rect[0].Y, rect[1].X - rect[0].X);
mat.Translate(-rect[0].X, -rect[0].Y);
mat.RotateAt((float)angle, rect[0]);
(或者类似的东西。可能是-angle
,或者rect[0]
而不是rect[1]
,反之亦然Atan2
。我不能立即检查......)
【讨论】:
我想出了一些非常相似的东西,但有点不对劲。【参考方案2】:想通了:
protected static Bitmap CropImage(Bitmap src, Vector2[] rect)
var width = (rect[1] - rect[0]).Length;
var height = (rect[3] - rect[0]).Length;
var result = new Bitmap(M2.Round(width), M2.Round(height));
using (Graphics g = Graphics.FromImage(result))
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
using (Matrix mat = new Matrix())
var rot = -Math.Atan2(rect[1].Y - rect[0].Y, rect[1].X - rect[0].X) * M2.RadToDeg;
mat.Translate(-rect[0].X, -rect[0].Y);
mat.RotateAt((float)rot, rect[0].ToPointF());
g.Transform = mat;
g.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height));
return result;
【讨论】:
以上是关于如何裁剪带有旋转矩形的图像?的主要内容,如果未能解决你的问题,请参考以下文章
将 UIScrollview 中显示的图像裁剪为覆盖层中显示的矩形