【问题标题】:Saving image: A generic error occurred in GDI+. (vb.net)保存图像:GDI+ 中出现一般错误。 (vb.net)
【发布时间】:2013-02-07 18:14:04
【问题描述】:

我需要在从 OFD 打开图像后保存它。 这是我的自动取款机:

Dim ofd As New OpenFileDialog
ofd.Multiselect = True
ofd.ShowDialog()


For Each File In ofd.FileNames
   Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)
Next

Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png) 行上出现错误。

(注意:应用程序将在此基础上构建,这只是我的第一个代码,需要保存而不是复制)

【问题讨论】:

    标签: .net vb.net image gdi+


    【解决方案1】:

    我会检查两件事:

    1. 您要保存到的目录 存在
    2. 您有写入权限 这个目录

    【讨论】:

    • 好吧,我以为我已经检查了目录是否存在,但它并没有非常感谢,我真的很讨厌它,尽管当我花了很长时间试图找出它为什么不起作用然后知道它是一件非常简单的事情时:)
    • 我很高兴你是这个星球上唯一发生这种情况的人! :)
    【解决方案2】:

    打开或保存图像会锁定文件。覆盖此文件需要您首先对持有锁的 Image 对象调用 Dispose()。

    我不太了解您的代码,但您必须这样做:

        For Each File In ofd.FileNames
            Using img As Image = Image.FromFile(File)
                img.Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.Png)
            End Using
        Next
    

    Using语句确保img对象被释放,文件锁被释放。

    【讨论】:

      【解决方案3】:

      图像放置了一个锁。

      例如,我使用此缓冲区图像保存到内存流中。

      byte[] ImageData = new Byte[0];
      if (BackGroundImage != null)
          {
              Bitmap BufferImage = new Bitmap(BackGroundImage);
              MemoryStream ImageStream = new MemoryStream();
              BufferImage.Save(ImageStream, ImageFormat.Jpeg);
              BufferImage.Dispose();
              ImageData = ImageStream.ToArray();
              ImageStream.Dispose();
      
      
              //write the length of the image data...if zero, the deserialier won't load any image
              DataStream.Write(ImageData.Length);
              DataStream.Write(ImageData, 0, ImageData.Length);
          }
          else
          {
              DataStream.Write(ImageData.Length);
          }
      

      【讨论】:

        【解决方案4】:

        其中一个原因是您从中加载主图像的流(MemoryStream 或任何其他流)已被释放!

        这种情况:

        这是一个将字节数组转换为位图的扩展方法,但是using语句会释放内存流,这总是会导致这个错误:

            public static Bitmap ToBitmap(this byte[] bytes)
            {
                if (bytes == null)
                {
                    return null;
                }
                else
                {
                    using(MemoryStream ms = new MemoryStream(bytes))
                    {
                        return new Bitmap(ms);
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2010-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-26
          • 1970-01-01
          相关资源
          最近更新 更多