2010-01-12 75 views
3

我需要从OFD打开后保存图像。 这是我的代码大气压:保存图像:在GDI +中发生了一般性错误。 (vb.net)

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)它的错误出现。

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

回答

16

我会检查两件事情:

  1. 该目录你“再保存到 存在
  2. ,你有写权限 这个目录
+0

嗯,我我以为我检查了目录存在,但它没有感谢这么多,我真的很讨厌它,虽然当我花了很多时间试图找出为什么它不工作,然后知道它是一种可笑的简单:) – 2010-01-12 18:12:45

+0

我很高兴你这个星球上唯一发生这种事的人! :) – 2010-01-12 18:16:02

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对象设置和文件锁被释放。

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

这样做的一个原因是您已经加载了主图像的流(MemoryStream或任何其他流)已被丢弃!

这种这种情况下:

这是一个字节数组转换为位图的扩展方法,但使用的语句将配置内存流,这总会引起这样的错误:

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