2011-01-26 88 views
4

我试图调整大小和使用图像下面的函数,并收到此错误:一般性错误+

异常详细信息:System.Runtime.InteropServices.ExternalException:GDI +中发生一般性错误。

在这条线:

imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters);

任何想法,为什么这可能发生?

private byte[] GetCachedImage(string cachedFileName, string pathToImage, int width, int height) 
     { 
      if (!System.IO.File.Exists(cachedFileName) || (System.IO.File.GetLastWriteTime(pathToImage) > System.IO.File.GetLastWriteTime(cachedFileName))) 
      { 
       Image imageToResize = Image.FromFile(pathToImage); 
       Image imageConvertedToBitmap = new Bitmap(width, height); 

       Graphics graphicsController = Graphics.FromImage(imageConvertedToBitmap); 
       graphicsController.InterpolationMode = InterpolationMode.HighQualityBicubic; 
       graphicsController.SmoothingMode = SmoothingMode.HighQuality; 
       graphicsController.PixelOffsetMode = PixelOffsetMode.HighQuality; 
       graphicsController.CompositingQuality = CompositingQuality.HighQuality; 
       graphicsController.DrawImage(imageToResize, 0, 0, width, height); 

       EncoderParameters parameters = new EncoderParameters(1); 
       parameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L); 

       ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders(); 
       EncoderParameters encoderParameters = new EncoderParameters(1); 
       encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L); 

       MemoryStream memoryStream = new MemoryStream(); 
       imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters); 
       imageConvertedToBitmap.Save(memoryStream, info[1], encoderParameters); 

       imageToResize.Dispose(); 
       imageConvertedToBitmap.Dispose(); 
       graphicsController.Dispose(); 
       parameters.Dispose(); 
       encoderParameters.Dispose(); 

       return memoryStream.GetBuffer(); 
      } 

      byte[] buffer = null; 

      try 
      { 
       FileStream fileStream = new FileStream(cachedFileName, FileMode.Open, FileAccess.Read); 
       BinaryReader binaryReader = new BinaryReader(fileStream); 

       long totalBytes = new FileInfo(cachedFileName).Length; 

       buffer = binaryReader.ReadBytes((Int32)totalBytes); 

       fileStream.Close(); 
       fileStream.Dispose(); 
       binaryReader.Close(); 
      } 
      catch { } 

      return buffer; 
     } 
+1

什么其他信息在。例外?内部异常,源,堆栈追溯等 – winwaed 2011-01-26 17:56:20

+1

@winwaed:恐怕没有多少希望。通用的GDI +错误意味着你只需要自己弄清楚什么是错的。 – MusiGenesis 2011-01-26 17:58:48

+0

`info [1]`的价值是什么? – SwDevMan81 2011-01-26 18:09:33

回答

4

这是一个权限错误。必须给我保存的目录提供适当的写权限。有时候是简单的事情。 :)

从我读到的,当得到这个GDI +错误,首先检查应该是权限,因为它几乎总是一个安全问题的指标。

0

尝试的Save过载不采取EncoderParameters作为参数传递。它应该可以正常工作并生成您正在查找的已调整大小的图像。

0

我有这个错误一次,这是因为我试图通过一个Bitmap对象保存在一个锁定的文件下。 我们只是看到你的方法,而不是你如何使用它。

我认为在你的代码中有几个语法问题:你必须在你的代码中为所有禁用对象使用“using(){}”。

using(Image imageToResize = Image.FromFile(pathToImage)) 
using(Image imageConvertedToBitmap = new Bitmap(width, height)) 
etc. 
{ 
}