2011-01-26 79 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. 
{ 
}