2016-04-03 3 views
3

System.Windows.Media.Imaging.BitmapImageでサポートされているイメージ形式のリストを取得するにはどうすればよいですか?BitmapImageからサポートされているイメージ形式を取得する

私はC#WPFで簡単な画像処理ツールを書いています。 BitmapImageクラスは、さまざまな形式からデコードできるので、より有用なビットマップクラスの1つです。

特に、自分のコンピュータでNEF(NikonのRAW形式)を開くことができます。 BitmapImageは、他のメーカーのさまざまなRAW形式を開くことができる可能性があります。私はこの機能を利用したいと考えています。

BitmapImageとして開くことができるすべての形式がわからないので、私は現在、try/catchを使用して、ユーザーが開こうとするすべてのファイルからBitmapImageを構築しようとしています。これは明らかに最も効率的な方法ではありません。

私が知る限り、BitmapImageはBitmapSourceから継承しており、BitmapSourceはwhich files it can open by looking on the user's system for available codecsを決定します。したがって、コーデックの可用性はマシンによって異なるため、サポートされているフォーマットのリストをプログラムにハードコードすることはできません。これらのサポートされているフォーマットがユーザーのマシン上でどのようなものかを確認する方法が必要です。

System.Drawingにthis methodが見つかりました。これにより、サポートされているファイル拡張子のリストを持つサポートされているコーデックのリストが返され、Systems.Windows.Media.Imagingの同等の機能が必要なものになります。

+2

[この回答](http://stackoverflow.com/a/8343497/1136211)が面白いかもしれません。 – Clemens

答えて

2

Clemensの回答にリンクされているソースコードに示されているようにWICを直接処理したくない場合は、追加のコーデック(デフォルトでWICでサポートされていないコーデック)名前とサポートされているファイル拡張子を直接レジストリから取得します。

次のサンプルコードを参照してください。

/// <summary> 
/// Sample code: Show the additional registered decoders 
/// </summary> 
private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var additionalDecoders = GetAdditionalDecoders(); 

    foreach(var additionalDecoder in additionalDecoders) 
    { 
     MessageBox.Show(additionalDecoder.FriendlyName + ":" + additionalDecoder.FileExtensions); 
    } 
} 

/// <summary> 
/// GUID of the component registration group for WIC decoders 
/// </summary> 
private const string WICDecoderCategory = "{7ED96837-96F0-4812-B211-F13C24117ED3}"; 

/// <summary> 
/// Represents information about a WIC decoder 
/// </summary> 
public struct DecoderInfo 
{ 
    public string FriendlyName; 
    public string FileExtensions; 
} 

/// <summary> 
/// Gets a list of additionally registered WIC decoders 
/// </summary> 
/// <returns></returns> 
public static IEnumerable<DecoderInfo> GetAdditionalDecoders() 
{ 
    var result = new List<DecoderInfo>(); 

    string baseKeyPath; 

    // If we are a 32 bit process running on a 64 bit operating system, 
    // we find our config in Wow6432Node subkey 
    if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) 
    { 
     baseKeyPath = "Wow6432Node\\CLSID"; 
    } 
    else 
    { 
     baseKeyPath = "CLSID"; 
    } 

    RegistryKey baseKey = Registry.ClassesRoot.OpenSubKey(baseKeyPath, false); 
    if (baseKey != null) 
    { 
     var categoryKey = baseKey.OpenSubKey(WICDecoderCategory + "\\instance", false); 
     if (categoryKey != null) 
     { 
      // Read the guids of the registered decoders 
      var codecGuids = categoryKey.GetSubKeyNames(); 

      foreach (var codecGuid in codecGuids) 
      { 
       // Read the properties of the single registered decoder 
       var codecKey = baseKey.OpenSubKey(codecGuid); 
       if (codecKey != null) 
       { 
        DecoderInfo decoderInfo = new DecoderInfo(); 
        decoderInfo.FriendlyName = Convert.ToString(codecKey.GetValue("FriendlyName", "")); 
        decoderInfo.FileExtensions = Convert.ToString(codecKey.GetValue("FileExtensions", "")); 
        result.Add(decoderInfo); 
       } 
      } 
     } 
    } 

    return result; 
} 

これは、32ビットまたは64ビットプロセスで実行しているかどうかによって異なる結果を返すことに注意してください。たとえば、私のWindows 10マシンでは、PSDファイルを読み込むためにMicrosoft社のPhotoshopデコーダがインストールされています。ただし、32ビット版のみがインストールされています。

Photoshop PSDファイルをBitmapImageでロードしようとすると、32ビットアプリケーションを実行すると成功しますが、64ビットアプリケーションを実行していない場合は成功します。レジストリからインストールされたデコーダを読み取る上記のコードはこれを正しく反映しています。

+0

これは素晴らしいです - 完璧に動作します! –

関連する問題