保存图像:GDI +中发生一般错误。 (vb.net)

时间:2010-01-12 17:36:20

标签: .net vb.net image gdi+

我需要在从OFD打开后保存图像。 这是我的代码atm:

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)行上,它出现了错误。

(注意:应用程序将建立在这样,这只是我的第一个代码,它需要保存而不是复制)

4 个答案:

答案 0 :(得分:16)

我会检查两件事:

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

答案 1 :(得分:6)

打开或保存图像会锁定文件。覆盖此文件需要首先在持有锁的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对象并释放文件锁。

答案 2 :(得分:1)

图像放锁。

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

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

答案 3 :(得分:0)

这样做的一个原因是您已经处理了从主图像加载的流(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);
            }
        }
    }