0

左边是我使用类似绘画的程序绘制的多边形。右边是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混淆并把它放在错误的位置呢?看起来它正在缩小整个矩形。

4

1 回答 1

2

你很困惑。矩形是正确的,但是背景图像被放大了。请注意,6 和黑色正方形要大得多,但矩形的大小完全相同。

请注意,该Graphics.DrawImage方法会缩放源图像以匹配目标分辨率。

此方法使用其物理尺寸绘制图像,因此无论显示设备的分辨率(每英寸点数)如何,图像都将具有以英寸为单位的正确尺寸。例如,假设图像的像素宽度为 216,水平分辨率为每英寸 72 点。如果调用此方法在分辨率为每英寸 96 点的设备上绘制该图像,则渲染图像的像素宽度将为 (216/72)*96 = 288。

您应该使用接受 a的重载Rectangle

g.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height));
于 2013-03-29T22:38:13.157 回答