Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# “如何修复此错误”;GDI+;中发生一般性错误&引用;?_C#_Image_Save_Picturebox - Fatal编程技术网

C# “如何修复此错误”;GDI+;中发生一般性错误&引用;?

C# “如何修复此错误”;GDI+;中发生一般性错误&引用;?,c#,image,save,picturebox,C#,Image,Save,Picturebox,从默认名称打开图像并按默认名称保存。(覆盖它) 我需要从图像(“Default.jpg”)生成图形,将其放在picturebox1.Image上,然后在picturebox1上绘制一些图形。(它可以工作,这不是我的问题),但我无法将picturebox1.Image覆盖保存在“Default.jpg”上(这是我的问题)。如果我更改保存名称,它可以工作,但我需要覆盖它并多次打开它。 多谢各位 Boolean Play = false; Pen P = new Pen(Color.B

从默认名称打开图像并按默认名称保存。(覆盖它)

我需要从图像(“Default.jpg”)生成图形,将其放在picturebox1.Image上,然后在picturebox1上绘制一些图形。(它可以工作,这不是我的问题),但我无法将picturebox1.Image覆盖保存在“Default.jpg”上(这是我的问题)。如果我更改保存名称,它可以工作,但我需要覆盖它并多次打开它。 多谢各位

    Boolean Play = false;
    Pen P = new Pen(Color.Black, 2);
    Graphics Temp;
    int X1, X2, Y1, Y2;
    Image Default_Image = new Bitmap("Default.jpg");
    public Form1()
    {
        InitializeComponent();
        Temp = pictureBox1.CreateGraphics();
    }
    private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (Play)
        {
            X2 = e.X;
            Y2 = e.Y; ;
            Temp.DrawLine(P, X1, Y1, X2, Y2);
            pictureBox1.Image.Save("Default.jpg");
            Play = false;
        }
        else
        {
            Default_Image = new Bitmap("Default.jpg");
            Temp = Graphics.FromImage(Default_Image);
            pictureBox1.Image =Default_Image;
            X1 = e.X;
            Y1 = e.Y;
            Play = true;
        }
    }

{“GDI+中发生一般性错误”。}

要覆盖图像,您需要确保图像没有连接<代码>关闭,
处理
克隆
是不够的

以下是创建真正独立副本的函数:

Bitmap GetClone(string imageName)
{
    if (!File.Exists(imageName)) return null;
    Bitmap bmp2 = null;
    using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imageName))
    {
        bmp2 = new Bitmap(bmp.Width, bmp.Height, bmp.PixelFormat);
        bmp2.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
        using (Graphics g = Graphics.FromImage(bmp2))
        {
            g.DrawImage(bmp, 0, 0);
        }
    }
    return bmp2;
}
现在您可以执行以下操作:

string file = yourImageFileName;
Bitmap bmp = GetClone(file);
using (Graphics g = Graphics.FromImage(bmp))
{
    // draw what you want..
    g.DrawRectangle(Pens.Red, 11, 11, 199, 199);
}
bmp.Save(file, ImageFormat.Png);  // use your own format etc..
您还应注意不要泄露旧的
PictureBox.Image
版本。。下面是一个辅助函数:

void SetPBoxImage(PictureBox pbox, Bitmap bmp)
{
    Bitmap dummy = (Bitmap)pbox.Image;
    pbox.Image = null;
    if (dummy != null) dummy.Dispose();
    pbox.Image = bmp;
}

如果您从未处理过拥有新创建的“Default.jpg”的
位图
,那么在您尝试保存时,它可能仍会打开该文件。GDI包装库不提供特别有用的异常消息。是的,我想我需要一个代码在保存之前关闭文件。我处理并保存了它,但没有保存图形。我尝试处理,但工作不正常。我尝试在默认图像中保存picturebox1.image,但更改的图形未保存为图像。请原谅我的英文书写不好。有疑问。你是如何使用代码的?请注意,您不能读取目标文件!你现在开始工作了吗请注意,不建议您使用处理图形的方式!你说我不应该读目标文件是什么意思?我使用“位图bmp=newbtimap(字符串文件名);”我指的是我写的东西。而不是
bitmap bmp=new btimap(字符串文件名)使用位图bmp=GetClone(文件)