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

以下のサンプルコードで、「Generic error occurred in GDI +」というエラーが表示されます。私がしているのは、ライブサイトで利用可能な多くのjpegファイルに対する応答を求めるリクエストを作成することです。 応答が得られたら、アプリケーションのローカルフォルダにファイルを保存します これらのイメージをバイナリ(配列のバイト)に変換して、データベースに保存することができます。

private byte[] GetBinaryImageData(string imgURL)
{
    HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(imgURL);
    WebResponse response = Request.GetResponse();
    Stream str = response.GetResponseStream();
    System.Drawing.Image objTempImg = System.Drawing.Image.FromStream(str);
    objTempImg.Save(FileName, ImageFormat.Jpeg);

    FileStream fileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read);
    byte[] buffer = new byte[fileStream.Length];
    fileStream.Read(buffer, 0, (int)fileStream.Length);
    fileStream.Close();
    return buffer;
}

私はすべての画像でこのエラーが発生しませんが、いくつかの画像で発生します。誰もが解決策を知っていますか?私はすでに2日過ごした

0
同じ画像が毎回エラーを投げますか?どのラインがエラーを投げていますか?エラーの原因となっている画像のパターンがありますか?
追加された 著者 annonymously,
私は最近、 "GDI +で一般的なエラーが発生しました"というエラーが、宛先ディレクトリが存在しない場合に発生する可能性があることを発見しました。
追加された 著者 Vince Panuccio,
はい、また、名前に違法な文字が含まれているファイルを保存しようとしている場合などです。 swivel/action.jpg
追加された 著者 Marbella Consulting,

2 答え

私が推測しなければならなかったら; あなたは物事を正しく処分していませんという理由で、時折ハンドルに問題があります。これはGDI +のようなものにとって特に重要です。それらのオブジェクトのすべて IDisposable なので、あなたのコードにいくつかの using

HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(imgURL);
using(WebResponse response = Request.GetResponse())
using(Stream str = response.GetResponseStream())
using(System.Drawing.Image objTempImg = System.Drawing.Image.FromStream(str))
{
    objTempImg.Save(FileName, ImageFormat.Jpeg);
}
return File.ReadAllBytes(FileName);

Stream.Read が実際にすべてのデータを読み込んでいると仮定すると間違ったであることに注意してください。戻り値とループをチェックしますが、すべてを必要とするので File.ReadAllBytes は簡単です)。

2
追加された
@MarcGravell、助けてくれてありがとう。私にとって、このトリックはエラーの数を減らしましたが、まだ処理できないファイルもあります。時間があれば、ここで私の質問を見てください。 stackoverflow.com/questions/8957708/… `
追加された 著者 st78,
同じimages.iについて同じエラーが表示される場合は、上記のイメージファイルのバイトを読み取るためのコード全体を使用しました。
追加された 著者 ravidev,
@ Marc.iはこのcode.itを試してみました。
追加された 著者 ravidev,
using(MemoryStream ms = new MemoryStream()){byte [] temp =新しいバイト[ImgSize]; int read = 0; while(read = str.Read(temp、0、temp.Length))> 0){ms.Write(temp、0、read); } return ms.ToArray(); }
追加された 著者 ravidev,
私がMemoryStreamを使用する場合、これは私のアプリケーションのCPUまたはパフォーマンスに影響しますか?
追加された 著者 ravidev,
ご協力いただきありがとうございます
追加された 著者 ravidev,
@ravidev Andrewの答えに従って、データを MemoryStream にコピーしてみましたか?つまり、(var ms = new MemoryStream())を使用して - 両方の回答の組み合わせ?
追加された 著者 Marc Gravell,
@ravidev CPUには影響しません。画像が巨大であればもう少しメモリが必要かもしれませんが、巨大な画像をロードしているので、間違いです。
追加された 著者 Marc Gravell,

この記事で判断すると、イメージが読み込まれるストリームが表示されます。画像の寿命や悪いことが起こる可能性があります。

私はこれを随時実行しており、画像データをメモリストリームやファイルにコピーするのが最も簡単であることが分かりました。

リンクされた記事から:

GDI +、したがってSystem.Drawing名前空間は、   ビットが画像によって必要とされるまで生の画像ビットの復号化。   さらに、画像がデコードされた後でも、GDI +は   大量のメモリを廃棄する方が効率的であると判断する   後で再デコードすることができます。したがって、GDI +にアクセスする必要があります   ビットマップまたはイメージの寿命の間、イメージのソースビット   オブジェクト。

     

ソースビットへのアクセスを維持するために、GDI +はソースファイルをロックします。   アプリケーションがすべてのソースストリームの寿命を維持するよう強制します。   ビットマップまたはイメージオブジェクトの寿命。

2
追加された
良いキャッチ;確かに、GDIはシークしたい傾向があります(特に NetworkStream での信頼できる操作ではありません
追加された 著者 Marc Gravell,
そうです。ストリームがシーク可能かどうかを実際に確認する必要があります。アンマネージストリームで利用できるかどうかはわかりませんが
追加された 著者 Marc Gravell,
それは有用なエラーメッセージが多くの人々に多くの苦痛を救うことができる漏れ抽象の1つです:
追加された 著者 Andrew Kennan,