4

我正在从文件加载位图图像。当我尝试将图像保存到另一个文件时,出现以下错误“GDI+ 中发生一般错误”。我相信这是因为文件被图像对象锁定。

好的,所以尝试调用 Image.Clone 函数。这仍然会锁定文件。

唔。接下来我尝试从 FileStream 加载位图图像并将图像加载到内存中,这样 GDI+ 就不会锁定文件。这很好用,除非我需要使用 Image.GetThumbnailImage 方法生成缩略图,它会引发内存不足异常。显然我需要保持流打开以停止此异常,但如果我保持流打开,则文件保持锁定状态。

所以这种方法不好。最后,我创建了该文件的副本。所以现在我有两个版本的文件。1 我可以在我的 c# 程序中锁定和操作。这个其他原始文件保持解锁状态,我可以将修改保存到其中。这样做的好处是即使在保存更改后也可以恢复更改,因为我正在操作无法更改的文件副本。

当然有更好的方法来实现这一点,而不必拥有 2 个版本的图像文件。有任何想法吗?

4

3 回答 3

2

好吧,如果您正在寻找其他方法来做您所要求的事情,我认为它应该可以创建一个 MemoryStream,并将 FileStream 读出到它,并从该流中加载图像......

var stream = new FileStream("original-image", FileMode.Open);
var bufr = new byte[stream.Length];
stream.Read(bufr, 0, (int)stream.Length);
stream.Dispose();

var memstream = new MemoryStream(bufr);
var image = Image.FromStream(memstream);

或者更漂亮的东西。

我不知道这是否是您解决该问题的方法。:) 我遇到了类似的问题,最后像这样修复它。

于 2008-10-31T13:37:11.900 回答
2

从那以后,我找到了一种替代方法来克隆图像而不锁定文件。Bob Powell 拥有这一切以及更多的 GDI 资源

      //open the file
      Image i = Image.FromFile(path);

      //create temporary
      Image t=new Bitmap(i.Width,i.Height);

      //get graphics
      Graphics g=Graphics.FromImage(t);

      //copy original
      g.DrawImage(i,0,0);

      //close original
      i.Dispose();

      //Can now save
      t.Save(path)
于 2008-11-04T14:20:58.300 回答
1

我有一个类似的问题。但我知道,我会将图像保存为位图文件。所以我这样做了:

    public void SaveHeightmap(string path)
    {
        if (File.Exists(path))
        {
            Bitmap bitmap = new Bitmap(image); //create bitmap from image
            image.Dispose(); //delete image, so the file

            bitmap.Save(path); //save bitmap

            image = (Image) bitmap; //recreate image from bitmap
        }
        else
            //...
    }

当然,这不是最好的方法,但它的工作原理:-)

于 2015-03-11T10:21:32.827 回答