使用GraphicsPath剪切图像

时间:2012-07-18 22:52:33

标签: c# .net

我的问题是通过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的表单,带有背景图像。我有两个按钮,具有以下功能:

    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方法)是我想要保存的,但是,通过第二个按钮和方法Save保存的剪切图像会失真,变小和移动。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我想通了 - 它是面板中背景图像的分辨率。 Bitmap img的Horizo​​ntalResolution和VerticalResolution属性必须与Graphics的DPIX和DPIY属性相匹配。我没有找到如何通过C#设置任何这些,但我能够在Photoshop中更改位图的分辨率,现在一切正常。