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

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

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

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

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

当然有一种更好的方法来实现这一点,而无需拥有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); 

或者是那种更漂亮的东西。

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

我已经找到了一种替代方法来克隆图像而不锁定文件。 鲍勃鲍威尔拥有这一切以及更多的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) 

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

  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 //... } 

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