2009-07-17 29 views
1

C#アプリケーションに読み込めないようなJPEGファイルがあります。彼らはGIMPのような他のアプリケーションにうまくロードされます。JPEGの読み込み中にエラーが発生しました:「一般的なエラーがGDI +で発生しました」

System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:\Image.jpg"); 

私が手に例外がある:「一般的なエラーがGDI +で発生しました」、実際には非常に有用ではありませんこれは私が画像をロードするために使用しているコードの行です。他の誰かがこれにぶつかったり、その周りに道を知っていますか?

注:問題をテストする場合は、download a test imageがC#で動作しない可能性があります。

+0

私はこのエラーが大好きです。「ちょっと、ちょっとジャンクが起きました。マイクロソフトは、「すみませんが、GDI +が一般的なエラーを経験した以上のことは何も教えてくれません」のように意味のある何かをあなたに伝えないことについて、少なくとも謝罪するだろうと考えています。 –

答えて

1

.Netはその特定のイメージのフォーマットを処理していません.Jpegデータフォーマットが少し壊れているか、または標準ではないためです。イメージをGIMPに読み込んで新しいファイルに保存すると、Imageクラスを使って読み込むことができます。おそらく、GIMPはファイルフォーマットの問題をもう少し寛容にしてくれます。

+0

画像を保存し直しても問題は解決します。 C#がこのイメージを読み込めない理由を知るには、whe n非.NETアプリケーションは問題ありません。 –

+0

ファイルの内部構造がjpeg標準に違反している可能性があります.GIMPやその他のプログラムはこれを処理できます。これは珍しい状況ではなく、一部の標準の早期実装にエラーが含まれているか、仕様があいまいであり、そのエラーがデファクト標準になります。そのクラスまたはImageクラスには本当にバグが含まれているか、またはJPEG標準を完全にサポートしていません。 – redcalx

0

このthread from MSDN Forumsは有用かもしれません。データを意味するかもしれ

エラーが 壊れているか、あまりにも早く接近されているいくつかの基本的な流れ があります。

+0

.NETは明らかに画像が壊れていると見ていますが、画像エディタ "GIMP"にロードされているので問題ありません。 –

+0

アクセス許可の問題ではないと仮定して、Paint.NETで正しく開きます(.NETでも使用されるため)。 – sigint

+0

Paint.NETでも動作しません。 : –

0

このエラーは権限の問題である可能性があります。特に、アプリケーションがASP.NETアプリケーションの場合実行可能ファイル(Winの場合)またはWebアプリケーションのルートディレクトリ(asp.netの場合)と同じディレクトリにファイルを移動してみてください。

+0

同じ場所から他の画像ファイルを読み込むことができますが、画像ファイルがどこにあってもロードされません。 –

5

この問題は正解です。私たちは今日この仕事に遭遇しました。私はここで何が起こっているのかを決定的に証明することができました。

JPEG規格では、データの一連の「チャンク」(「セグメント」と呼ばれる)からなるファイルであるメタデータ形式が定義されています。各チャンクはFFマーカで始まり、別のマーカ・バイトが続き、チャンクの種類を識別し、その後にチャンクの長さを表すバイトのペア(16ビットのリトル・エンディアン値)が続きます。一部のチャンク(FFD8、 "Start of Image"など)はファイルの使用に不可欠であり、一部のもの(FFFE、 "Comment"など)はまったく無意味です。

JPEG規格が定義されているときには、「アプリケーション固有のデータ」に使用されることになっていた、いわゆる「APPマーカー」---タイプFFE0〜FFEF ---も含まれていました。これらは様々なプログラムによってさまざまな方法で悪用されますが、ほとんどの場合、JFIFデータに使用されるAPP0(FFE0)を除いて、無意味で無視できます.JFIFはJPEG標準を画像のDPIのような有用な情報を追加します。

imageの問題は、そのマーカーの後にサイズゼロのチャンクがあるFFE1マーカーが含まれていることです。そうでなければ、それほど目立たない小さな無駄なAPP1チャンクを除いて、目に見えない画像データ(顕著な画像ですが、目に見えないデータ)です。 GDI +は誤ってそのAPP1チャンクを解釈しようとしていますが、おそらくそれをEXIFデータとして解読しようとしていて、それが爆発しています。 (私の推測では、GDI +は実際にはサイズゼロの配列を処理しようとしているために死んでいるということです)。正しく書かれていれば、理解できないAPPNチャンクは無視されますが、定義されたデータは非標準であり、炎に爆発する。

解決策は、ファイルをメモリに読み込んで不要なAPPnチャンク(マーカーFFE1〜FFEF)を取り除き、その結果得られた「クリーン」画像データをGDI +に送ります。正しく処理してください。

我々は現在投じについては


:-)楽しい賞品と、JPEG-クリーニングルーチン最速書くことができます誰が見てここに仕事で進行中のコンテストがあります。そのイメージがではありませんが「わずかに非標準」イメージはAPP1を独自の目的で使用しています.GDI +はそのデータを処理しようとすると非常に間違っています。他のアプリケーションでは、想定されているようにAPPチャンクを正しく無視するため、画像を読むのに問題はありません。

+0

優秀な詳細!私はこれを試してみましょう、ありがとう。 :) –

0

私は同じ問題があります。

私が気づいた唯一の違いは圧縮です。 "JPEG"でうまく動作しますが、圧縮が "プログレッシブJPEG"の場合、例外が発生します(GDI +で一般的なエラーが発生しました)。

最初は、私が言及したイメージが大きかった(ディスクが約5MB、メモリが80MBだったかもしれない)ので、メモリの問題であると思ったが、圧縮タイプの違いに気づいた。

IrfanViewやGIMPのような他のプログラムで画像ファイルを開いたり保存したりすると結果はOKですが、それは考えていません。

+0

昨日同じコードを試してみましたが、うまくいきました。私は、.NET Frameworkの多くのアップデートの1つでは、Progressive JPEGのサポートが追加されたと思います。 – Mario

関連する問題