使用GDI +将修改后的图像保存到原始文件

时间:2008-10-31 13:22:03

标签: c# gdi+ image-manipulation

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

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

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

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

当然,有一种更好的方法可以实现这一目标,而无需拥有2个版本的图像文件。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

或者那种更漂亮的东西。

这是否是你应该解决这个问题的方式,我不知道。 :) 我遇到了类似的问题,最终解决了这个问题。

答案 1 :(得分:2)

我已经找到了一种替代方法来克隆图像而不锁定文件。 Bob Powell has it all plus more GDI resources

      //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)

答案 2 :(得分: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
            //...
    }

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