Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Graphics.DrawPolygon未在正确位置绘制_C#_.net_Bitmap - Fatal编程技术网

C# Graphics.DrawPolygon未在正确位置绘制

C# Graphics.DrawPolygon未在正确位置绘制,c#,.net,bitmap,C#,.net,Bitmap,左边是我用类似绘画的程序绘制的多边形。右侧是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)) {

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

您感到困惑。矩形正确,但背景图像已放大。请注意,6和黑色正方形要大得多,但矩形的大小完全相同

请注意,将缩放源图像以匹配目标分辨率

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

您应该使用接受
矩形的

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

你确定数字正确吗?如果正方形1的左上角是(0,0),那么正方形6的左上角是(50,50)-因此正方形6内的一个正方形像素将是(51,51,99,99)。另外,你不太清楚结果的错误,我只是假设你正试图在6号方格内画一个边框。@Jasmine:左边的就是我画的,我想右边的也一样。i、 例如,矩形应该覆盖大部分正方形6和11。你对6号方格的坐标是正确的,它应该是(51,51)-(100100)。好的,这个问题并不清楚。始终明确你得到了什么以及为什么它是错误的。你得到了你的答案,我忘记了那个方法中的缩放。是的…现在我看得更仔细了,它看起来确实是缩放。但这就是全部代码;在外部,我只调用
result.Save(“crop.jpg”)
,那么缩放发生在哪里呢?哦。。。这就是“物理”尺寸的含义??这完全出乎意料。非常感谢。