0

私の問題は、GraphicsPathを介して画像をクリッピングすることです。私はかなり複雑なクリッピングパス(さまざまな円弧で構成されています)を持っており、このパス内にある画像のその部分だけを保存する必要があります。

私はこのようなクラスを持っています:

class A 
{
    private GraphicsPath GetGraphicsPath()
    { 
        ... some stuff ...
        return gp;
    }

    public void Draw(Graphics g)
    {
         g.DrawPath(pen, GetGraphicsPath());
    }

    public Save(Image img, string fileName)
    {
        Bitmap b = new Bitmap(img.Width, img.Height);
        Graphics bg = Graphics.FromImage(b);
        bg.Clip = new Region(GetGraphicsPath());
        bg.DrawImage(img, 0, 0);
        b.Save(fileName + ".png");
    }
}

次に、背景画像を含むpnMainパネルのフォームがあります。次の機能を持つ2つのボタンがあります。

    private void button1_Click(object sender, EventArgs e)
    {
        Graphics g = pnMain.CreateGraphics();
        a.Draw(g);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Image img = pnMain.BackgroundImage;
        a.Save(img, "test");
    }

(どちらの場合も、aはAのインスタンスです)。私の問題は、(最初​​のボタンとメソッドDrawを使用して)画面に描画されたクリッピング領域が保存したいのですが、2番目のボタンとメソッドSaveを使用して保存されたクリップ画像が歪んで小さくシフトしていることです。私は何が欠けていますか?

4

1 に答える 1

0

私はそれを理解しました-それはパネルの背景画像の解像度です。Bitmap img のプロパティ Horizo​​ntalResolution および VerticalResolution は、Graphics の DPIX および DPIY プロパティと一致する必要があります。これらを C# 経由で設定する方法はわかりませんでしたが、Photoshop でビットマップの解像度を変更することができ、すべてが機能するようになりました。

于 2012-07-18T23:07:49.137 に答える