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 dpi であるとします。このメソッドを呼び出して、解像度が 96 dpi のデバイスでそのイメージを描画すると、レンダリングされたイメージのピクセル幅は (216/72)*96 = 288 になります。

代わりにa を受け入れるオーバーロードを使用する必要があります。Rectangle

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