Graphics.DrawPolygon 未在正确位置绘制

Posted

技术标签:

【中文标题】Graphics.DrawPolygon 未在正确位置绘制【英文标题】:Graphics.DrawPolygon not drawing at correct location 【发布时间】:2013-03-29 22:28:04 【问题描述】:

左边是我使用类似绘画的程序绘制的多边形。右边是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,对应于 inside 标记为“6”的黑色方块(如图所示在左图中)。

那么Graphics 是怎么弄错了地方的呢?看起来它正在缩小整个矩形。

【问题讨论】:

你确定数字是正确的吗?如果正方形 1 的左上角是 (0,0),那么正方形 6 的左上角是 (50,50) - 因此正方形 6 内的一个像素为 (51,51,99,99)。另外,您不太清楚结果有什么问题,我只是假设您正在尝试在正方形 6 内绘制边框。 @Jasmine:左边的是我画的,我想右边的出来一模一样。即,矩形应覆盖大部分正方形 6 和 11。您对正方形 6 的坐标是正确的,它应该是 (51,51)-(100,100)。 好的,从问题中并不清楚。始终明确说明您得到了什么以及错误的原因。不过你得到了答案,我忘记了那种方法中的缩放比例。 【参考方案1】:

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

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

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

您应该改用接受Rectangle 的overload:

g.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height));

【讨论】:

是的......现在我仔细观察,它似乎确实在缩放。但这就是代码的全部;在外面我只是打电话给result.Save("crop.jpg"),那么缩放发生在哪里? 哦...这就是“物理”大小的意思??这完全出乎意料。谢谢!!

以上是关于Graphics.DrawPolygon 未在正确位置绘制的主要内容,如果未能解决你的问题,请参考以下文章

PDF 未在 UIWebView 中正确显示

jquery 事件按钮显示正确的响应,但视图未在 django 中正确呈现

自定义安装字体未在 UILabel 中正确显示

使用 Twilio 发送的 vCard 未在 iOS 中正确呈现

NSUInteger 未在 TestFlight 上正确显示

自定义 AlertViewController 未在横向中正确显示