左边是我使用类似绘画的程序绘制的多边形。右边是System.Drawing.Bitmap / Graphics:
绘制的多边形
绘制它的代码如下:
protected static Bitmap CropImage(Bitmap src, Vector2[] rect)
{
var result = new Bitmap(src.Width, src.Height);
using (Graphics g = Graphics.FromImage(result))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
var pen = new Pen(Color.White);
g.DrawImage(src, new Point(0,0));
var poly = rect.Select(p => p.ToPointF()).ToArray();
g.DrawPolygon(pen, poly);
}
return result;
}
poly
是:
{System.Drawing.PointF[4]}
[0]: {X = 57.4230042 Y = 57.4229736}
[1]: {X = 147.058868 Y = 56.0224}
[2]: {X = 148.43277 Y = 143.951767}
[3]: {X = 58.7969131 Y = 145.352341}
图像中的每个黑色方块都是50x50。如果您查看poly
,则所有坐标都与您期望的完全一致:poly[0]
略高于50,50,对应于内标有“6”的黑色方块“(如左图所示)。
那么Graphics
如何混淆并将其置于错误的位置?看起来它正在缩小整个矩形。
答案 0 :(得分:2)
请注意,Graphics.DrawImage
method会缩放源图像以匹配目标分辨率。
此方法使用其物理尺寸绘制图像,因此无论显示设备的分辨率(每英寸点数)如何,图像都将以英寸为单位。例如,假设图像的像素宽度为216,水平分辨率为每英寸72点。如果您调用此方法在分辨率为每英寸96点的设备上绘制该图像,则渲染图像的像素宽度将为(216/72)* 96 = 288。
您应该使用接受Rectangle
的{{3}}代替:
g.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height));