Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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# 使用GraphicsPath剪裁图像_C#_.net - Fatal编程技术网

C# 使用GraphicsPath剪裁图像

C# 使用GraphicsPath剪裁图像,c#,.net,C#,.net,我的问题是通过GraphicsPath剪裁图像。我有一个相当复杂的剪辑路径(由各种圆弧组成),我只需要保存该路径中的图像部分 我有一门课是这样的: class A { private GraphicsPath GetGraphicsPath() { ... some stuff ... return gp; } public void Draw(Graphics g) { g.DrawPath(pen

我的问题是通过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的实例)。我的问题是,屏幕上绘制的剪辑区域(使用第一个按钮和方法绘制)是我想要保存的,但是,通过第二个按钮和方法保存保存的剪辑图像失真、变小和移位。我遗漏了什么?

我发现了——这是面板中背景图像的分辨率。位图img的水平分辨率和垂直分辨率属性必须与图形的DPIX和DPIY属性相匹配。我不知道如何通过C#设置这些,但我可以在Photoshop中更改位图的分辨率,现在一切正常。

加载位图后,您可以设置位图的分辨率。