【问题标题】:Saving a modified image to the original file using GDI+使用 GDI+ 将修改后的图像保存到原始文件
【发布时间】:2008-10-31 13:22:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# gdi+ image-manipulation


    【解决方案1】:

    好吧,如果您正在寻找其他方法来做您所要求的事情,我认为它应该可以创建一个 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);
    

    或者比这更漂亮的东西。

    我不知道你是否应该采用这种方式来解决这个问题。 :) 我遇到了类似的问题,最后就这样解决了。

    【讨论】:

    • 太棒了。那完成了工作。泰
    • 我是否会正确地认为一旦完成就必须处理图像和内存流。只处理图像仍然会留下内存流吗?
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        相关资源
        最近更新 更多