2008-10-31 74 views
4

我从文件加载位图图像。当我尝试将图像保存到另一个文件时,出现以下错误“GDI +中发生了一般性错误”。我相信这是因为该文件被图像对象锁定。使用GDI将修改后的图像保存到原始文件+

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

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

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

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

回答

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

那么,如果你正在寻找其他方法来做你想问的问题,我认为它应该工作来创建一个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); 

或更漂亮的程度。

不管你是否应该去解决这个问题,我不知道。 :) 我有类似的问题,并修复它像这样。

+0

真棒。那做了这个工作。 Ty – Crippeoblade 2008-11-01 20:04:33

0

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

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

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

相关问题