23205


Windows10、VisualStudio2015、.Net4.6、WPF、C# で開発しております。

System.Windows.Media.Imaging.BitmapDecoder.Create()
で読み込める画像ファイルの種類とその拡張子を取得する方法はありますでしょうか？

デジカメの画像ファイル(.CR2)とか読み込めるのですが、関数リファレンスからはサポートされているという情報を見つけられませんでした。OS依存かもしれませんので、コードで取得する方法を探しております。


CC BY-SA 3.0
2016-03-16T14:48:51.527
23202
2016-03-16T16:35:14.507
14817
question
c# .net wpf
BitmapDecoder がサポートしている画像ファイルの種類(拡張子)を全て取得したい


`BitmapDecoder`はWindows Imaging
Componentというフレームワークに登録されたコーデックを利用しています。なので対応しているフォーマットはOSのバージョン依存というよりは、インストールしているソフトによって変動します。

WICに追加されたコーデックはレジストリの`CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}`(WICBitmapDecoders)以下にCLSIDが登録されており、各クラスの配下に`FileExtensions`が登録されているので、それらの値から拡張子が取得できます。

[code]

    static void Main(string[] args)
    {
        // WICBitmapDecodersの一覧を開く
        var decoders = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Classes\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance");
        foreach (var clsId in decoders.GetSubKeyNames())
        {
            Console.WriteLine(clsId);
    
            // コーデックのレジストリを開く
            var codec = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Classes\CLSID\" + clsId);
    
            Console.WriteLine(codec.GetValue("FriendlyName"));
            Console.WriteLine(codec.GetValue("FileExtensions"));
            Console.WriteLine();
        }
    
        Console.ReadKey();
    }
    
[/code]

またJPEGやPNGといったOSネイティブのコーデック(7種類)は上記には登録されていません。なのでこれらに対しては実際にファイルを開いて情報を取得するのが良いのではないでしょうか。

[code]

    foreach (var fn in new[] { "dummy.jpg" })
        // TODO:bmp, gif, ico, jpg, png, tiff, wmpに対して行う
    {
        var dec = BitmapDecoder.Create(new Uri(Path.GetFullPath(fn)), BitmapCreateOptions.None, BitmapCacheOption.None);
    
        Console.WriteLine(dec.GetType());
        Console.WriteLine(dec.CodecInfo.FriendlyName);
        Console.WriteLine(dec.CodecInfo.FileExtensions);
        Console.WriteLine();
    }
    
[/code]


CC BY-SA 3.0
2016-03-16T16:35:14.507
23205
2016-03-16T16:35:14.507
5750
23202
answer