C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

BitmapDecoder.Create()の使い方について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■86301 / inTopicNo.1)  BitmapDecoder.Create()の使い方について
  
□投稿者/ なと (5回)-(2018/01/15(Mon) 14:50:38)

分類:[C#] 

2018/01/15(Mon) 14:55:43 編集(投稿者)

開発環境はWindows10 / C# 2010 .NET FrameWork4.0 です。

先日解決とした下記の質問の件につきまして完成したプログラムをWindows7のPCでテストした所、
下記の通りエラーが発生することが分かりました。

不適切な部分があれば教えていただけないでしょうか。

当時の質問スレッド
http://bbs.wankuma.com/index.cgi?mode=al2&namber=86272

プログラム
public static string ReadExif(string path)
{
using (FileStream fs = File.OpenRead(path))
{
Image bmp = Image.FromStream(fs, false, false);
//↓エラー箇所
var dec = BitmapDecoder.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.Default);
var frame = dec.Frames[0];
var meta = (BitmapMetadata)frame.Metadata;
var date1 = meta.GetQuery("/ifd/{ushort=34665}/{ushort=36867}");
if (date1 != null)
return date1.ToString();
}
return "";

エラーメッセージ
System.IO.FileFormatException: イメージ形式を認識できません。 ---> System.Runtime.InteropServices.COMException: HRESULT からの例外:0x88982F07
--- 内部例外スタック トレースの終わり ---
場所 System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
場所 System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
場所 System.Windows.Media.Imaging.BitmapDecoder.Create(Stream bitmapStream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption)

画像ファイルの種類(どのファイルでもエラーが出る)
・tiff(EXIF有り)
・jpg(EXIF有り)
・jpg(EXIF無し)

実行環境(エラーが出る)
・Windows 7 Pro 32bit
・Windows 7 SP1 Pro 64bit

開発環境(問題なし)
・Windows 10 Pro 1703 64bit

それと、EXIF情報の無いjpgファイルを開く時に「NotSupportedException」が出てしまうのですが、try〜catch以外の方法で
(あまり負荷をかけずに)検知するにはどうするのがお勧めでしょか。

以上、よろしくお願いいたします。
引用返信 編集キー/
■86302 / inTopicNo.2)  Re[1]: BitmapDecoder.Create()の使い方について
□投稿者/ Hongliang (599回)-(2018/01/15(Mon) 15:43:48)
> Image bmp = Image.FromStream(fs, false, false);

本当にこの行が存在しているなら、fsの現在位置が末尾まで行っている可能性がありますが。
その場合、fs.Position = 0;とするなどして現在位置を先頭に戻してください。

これが単に誤記なのであれば、そのTIFFファイルを、WICがサポートしていない可能性があります。
WikipediaによるとWindows Live Photo GalleryがWICを使用しているそうなので、これで開けるかをまず確認されてはいかがでしょう。

> それと、EXIF情報の無いjpgファイルを開く時に「NotSupportedException」が出てしまうのですが、try〜catch以外の方法で
> (あまり負荷をかけずに)検知するにはどうするのがお勧めでしょか。

BitmapDecoder.Createの時点で発生するのでしょうか?
であればtry-catchするしかないと思います。

// TIFFにしてもJPEGにしても、再現性のある画像ファイルを私は持っていませんので、
// ネットの画像等で該当するものがあれば提示いただいたほうがいいかも。
引用返信 編集キー/
■86303 / inTopicNo.3)  Re[2]: BitmapDecoder.Create()の使い方について
□投稿者/ なと (6回)-(2018/01/15(Mon) 16:46:18)
No86302 (Hongliang さん) に返信
>> Image bmp = Image.FromStream(fs, false, false);
この行をコメントアウト、またはfs.Position = 0;でエラーが解消され、tiffの撮影日時も取得できるようになりました!
つまりWindows10では何故か自動的にPosition=0に相当する処理がされていると言うことになるんでしょうか・・。

>>それと、EXIF情報の無いjpgファイルを開く時に「NotSupportedException」が出てしまうのですが、
本命の修正により追加質問のほうもエラーが出なくなりました。

事前に.PropertyItemsで撮影日時が見つかった場合はReturnしていたからEXIFを含むjpgでエラーが出ていなかったようです。原因の切り分け不足ですね・・。

さらにImage.FromStreamをusingで囲っていなかった事にも気が付きました・・・。

レベルの低い質問ですいません。
以上、ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ