2011-01-26 8 views
4

一般的なエラーがGDIに発生した+

例外の詳細: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

+1

@winwaed:あまり期待していない、私は恐れている。ジェネリックGDI +のエラーは、あなた自身が何が間違っているのかを把握しなければならないことを意味します。 – MusiGenesis

+0

'info [1]'の値は何ですか? – SwDevMan81

答えて

4

権限エラーです。私が保存していたディレクトリに適切な書き込み許可を与える必要がありました。時にはそれは単純なものです。 :)

このGDI +エラーが発生したとき、最初にチェックするのはアクセス許可である必要があります。ほとんどの場合、セキュリティ上の問題の指標になります。

+0

また、書き込みを試みるフォルダが存在するかどうかを確認します。 – McBodik

0

パラメータとしてEncoderParametersとらないSaveのオーバーロードを試してみてください。それはうまく動作し、あなたが探しているサイズ変更された画像を生成する必要があります。

+0

imageConvertedToBitmap.Save(cachedFileName); – Scott

0

このエラーが1回発生しました。これは、Bitmapオブジェクトによってロックされたファイルの下に保存しようとしたためです。 私たちはあなたの方法を見ていますが、あなたの使い方は見ていません。

コードにはいくつかの構文上の問題があると思います。コード内のすべての無効オブジェクトに対して "using(){}"を使用する必要があります。

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

これらは構文上の問題ではありません... GCがあなたのためにクリーンアッププロセスを実行するための別の方法です。使用を実装するが、強制または構文エラーではない。彼はすでにDisposeメソッドを使用していますが、それはちょうどいいです... –

関連する問題