【问题标题】:How to Fix this Error "A generic error occurred in GDI+"?如何修复此错误“GDI+ 中发生一般错误”?
【发布时间】:2019-11-18 11:17:09
【问题描述】:

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

我需要从 Image("Default.jpg") 制作图形,将其放在 picturebox1.image 上并在 picurebox1 上绘制一些图形。(它可以工作,这不是我的问题)但我无法保存 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+ 中出现一般错误。”}

【问题讨论】:

  • 如果您从未处理过拥有新创建的“Default.jpg”的Bitmap,那么当您尝试保存时,它可能仍然打开文件。 GDI 包装库不会提供特别有用的异常消息。
  • 是的,我想我需要一个代码来在保存之前关闭文件。我处理并保存它但没有图形保存。我尝试处理但没有正常工作。我尝试将 picturebox1.image 保存在 default_image但更改的图形未保存为图像。请原谅我的英文写作不好。

标签: c# image save picturebox


【解决方案1】:

覆盖图像,您需要确保没有与图像保持连接。 ClosingDisposingCloning 还不够……

这是一个创建真正独立副本的函数:

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;
}

【讨论】:

  • 值得怀疑。你是如何使用代码的?请注意,您不得阅读目标文件!
  • 你现在开始工作了吗? - 请注意,不推荐您处理绘图的方式!
  • 你的意思是我不应该读取目标文件?我使用“位图 bmp=new btimap(string filename);”
  • 我的意思是我写的。而不是 bitmap bmp=new btimap(string filename); 使用 Bitmap bmp = GetClone(file);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多