2012-07-18 80 views
0

我的问题是通过GraphicsPath剪切图像。我有一个相当复杂的剪切路径(由各种弧组成),我只需要保存该路径中的图像部分。用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保存的裁剪图像失真,变小。我错过了什么?

回答

0

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