web-dev-qa-db-ja.com

System.Drawing.Image.SaveのGDI +で一般的なエラーが発生しました

例外:

GDI +で一般的なエラーが発生しました。System.Drawing.Image.Save(String filename、ImageCodecInfo encoder、EncoderParameters encoderParams)at System.Drawing.Image.Save(String filename、ImageFormat format)at System.Drawing.Image .Save(String filename)

コード:

byte[] bitmapData = new byte[imageText.Length];
MemoryStream streamBitmap;
bitmapData = Convert.FromBase64String(imageText);
streamBitmap = new MemoryStream(bitmapData);
System.Drawing.Image img = Image.FromStream(streamBitmap);
img.Save(path);

Base64文字列をMemoryStreamに変換してから、System.Drawing.Image(Image.FromStream(streamBitmap))を作成します。最後に、画像は一時ファイルに保存されます。

奇妙なことは、Webサーバーでのアクティビティ(同時ユーザー数)が多く、IISRESETまたはアプリケーションプールのリサイクル後に一時的に問題が解決されたときに問題が発生するように見えることです...

==>ガベージコレクターの問題?

TEMPフォルダーの許可を既に確認しました...

22
Razor

ストリームから画像を読み込む場合、画像の有効期間中はストリームを開いたままにしておく必要があります。 MSDN Image.FromStream を参照してください。

画像が破棄される前でもメモリストリームが閉じられるため、例外が発生したと思います。このようにコードを変更できます

byte[] bitmapData = new byte[imageText.Length];
bitmapData = Convert.FromBase64String(imageText);

  using (var streamBitmap = new MemoryStream(bitmapData)
  {
      using (img = Image.FromStream(streamBitmap))
      { 
         img.Save(path);
      }
  }

同様の問題を議論するスレッドへのリンクをいくつか紹介します

gdi +ウェブページからの画像保存エラー

画像の描画時:System.Runtime.InteropServices.ExternalException:GDIで一般的なエラーが発生しました

指定したパスが有効であることを確認してください。ファイルパスが存在しない場合、以前の回答(メモリストリームでの使用)を使用すると、この正確なエラー「GDI +の一般エラー」が表示される場合があります。ファイルが作成され、ディレクトリパスが存在する必要があります。

8
mminneman

画像を保存するときに同じ例外メッセージが表示されました。私のコードは問題なく、それがすべきことをしていました。

問題は、ハードドライブがいっぱいであるため、新しいイメージを作成できなかったことです。保存するスペースがなかったため、作業中のプロジェクトを保存しようとしたときにのみ、これに気付きました。

2
Molay

私の場合、以下のスニペットはConvertedImageStringがAPIから受け取ったBase64Image文字列で問題なく動作し、それをフォーマット付きの関連画像に変換し、サーバー上の物理ファイルフォルダーに保存します。

編集:上記のエラーは、画像を保存しようとしているファイルパスが間違っているために発生する可能性があります

string converted = ConvertedImageString.Replace('-', '+');
converted = converted.Replace('_', '/');
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ConvertedImageString)))
{
    using (Bitmap bm1 = new Bitmap(ms))
    {
        newFileName =  id + ".jpg";
        newFileName = CleanFileName(newFileName);
        newFileName = newFileName.Replace(" ", "_");

        Path = Path + newFileName;

        bm1.Save(Path, ImageFormat.Jpeg);
    }
}
2