- 締切済み
画像ファイルの幅と高さを取りたい。
C Sharp、.Net 2.0の環境で開発しています。 using (System.IO.FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { imagew = System.Drawing.Image.FromStream(fs).Width; //横幅 imageh = System.Drawing.Image.FromStream(fs).Height; //高さ } ※filePathに画像のパスを入れてます。 上記で画像ファイル(すべてjpg)の縦横の高さを取得しているのですが、 ファイルが大量にあると途中でOutOfMemoryExceptionが発生してしまい 困っています。 メモリ不足にならない、何か別のやり方があればご教授いただけないでしょうか。 宜しくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- akinomyoga
- ベストアンサー率85% (100/117)
全く同じ質問が既に出ていますね…。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11104011881 ■System.Drawing.Image は System.IDisposable から派生しています。つまり、「開い」たら「閉じ」なければなりません。ルールです。 質問のコードだと画像を閉じることなく次々に開いていくので、すぐにメモリがなくなります。そこで、Image も using で宣言すれば、using のスコープが終わる所で Dispose して(閉じて)くれます。 using (System.IO.FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) using (System.Drawing.Image image = System.Drawing.Image.FromStream(fs)) { imagew = image.Width; //横幅 imageh = image.Height; //高さ } 或いは、わざわざ一旦 FileStream にしなくても、FromFile を用いて一発で開いて良いかと思います。 using (System.Drawing.Image image = System.Drawing.Image.FromFile(filePath)) { imagew = image.Width; //横幅 imageh = image.Height; //高さ } # というか、質問コードだと二回 FromStream を呼び出しているので、 # たかが画像サイズを取得するだけで画像を2個生成しているという意味でも大きな無駄です。 # 比較的大きなデータを扱う画像の処理は、一般的に重いですからね。 ■しかし、画像解像度を取得するだけであれば、画像データ本体をロードする必要自体本来ないはずです…が .NET Framework (乃至は GDI, GDI+) では、ファイルから画像解像度だけ取得する手段は標準で用意されていない様ですね。 一方で Windows の Shell にはその様な機能があって、それを COM を通して扱う方法が、参考URLの Yahoo 知恵袋で回答されているので参考になるでしょう (コード例は VB.NET ですが)。 ※但し、GetDetailsOf(item,26) の 26 が画像の「大きさ」を指定する番号ですが、この番号は OS によって異なるらしく(?) (Windows 7 では 31? 参考: http://dzone.sakura.ne.jp/blog/2009/12/vbnet-windows7getdetailsof.html)、また、取得できる文字列の形式も常に "横 × 縦" なのかは分からない (OS の言語によって異なりそう?) という事に注意した方が良いかもしれません。 ※後 Windows 7 では new ShellClass() では失敗するらしく→ http://d.hatena.ne.jp/RobinEgg/20110709/p1 そんなに速度を必要とされるのでなければ、まあ、FromStream/FromFile で画像データごと読み込んでしまって問題ないかと思います。