2016-04-03 8 views
3

Wie kann ich eine Liste der Bildformate erhalten, die von System.Windows.Media.Imaging.BitmapImage unterstützt werden?Unterstützte Bildformate von BitmapImage

Ich schreibe ein einfaches Bildverarbeitungswerkzeug in C# WPF. Die BitmapImage-Klasse ist eine der nützlicheren Bitmap-Klassen, da sie aus einer Vielzahl von Formaten entschlüsseln kann.

Insbesondere ist es in der Lage, NEF (Nikon RAW-Format) auf meinem Computer zu öffnen. Es ist wahrscheinlich, dass BitmapImage eine Vielzahl von RAW-Formaten anderer Hersteller öffnen kann, eine Funktion, die ich gerne nutzen möchte.

Da ich nicht jedes Format kenne, das als BitmapImage geöffnet werden kann, verwende ich derzeit eine try/catch, um ein BitmapImage aus jeder Datei zu erstellen, die der Benutzer zu öffnen versucht. Dies ist eindeutig nicht der effizienteste Weg.

Soweit ich weiß, erbt BitmapImage von BitmapSource, die which files it can open by looking on the user's system for available codecs entscheidet. Es ist daher wahrscheinlich, dass die Codec-Verfügbarkeit zwischen den Maschinen variiert, was bedeutet, dass eine Liste der unterstützten Formate nicht fest in das Programm codiert werden kann. Ich brauche eine Möglichkeit zu überprüfen, was diese unterstützten Formate auf dem Computer eines Benutzers sind.

Ich fand this method in System.Drawing. Dies gibt eine Liste der unterstützten Codecs mit einer Liste der unterstützten Dateierweiterungen zurück, und eine Entsprechung für Systems.Windows.Media.Imaging wäre genau das, was ich brauche.

+2

[Diese Antwort] (http://stackoverflow.com/a/8343497/1136211) kann interessant sein. – Clemens

Antwort

2

Wenn Sie nicht direkt mit WIC arbeiten wollen, wie im Quelltext in der von Clemens erwähnten Antwort gezeigt, können Sie eine Liste zusätzlicher Codecs (die von WIC standardmäßig nicht unterstützt werden) mit ihren Namen und unterstützte Dateierweiterungen direkt aus der Registrierung.

Siehe den folgenden Beispielcode.

/// <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; 
} 

Beachten Sie, dass dies unterschiedliche Ergebnisse zurückgeben kann, je nachdem, ob Sie in einem 32-Bit- oder 64-Bit-Prozess ausgeführt werden. Zum Beispiel habe ich auf meinem Windows 10-Rechner einen Photoshop-Decoder von Microsoft installiert, um PSD-Dateien zu lesen. Es ist jedoch nur eine 32-Bit-Version installiert.

Also, wenn ich versuche, eine Photoshop PSD-Datei über BitmapImage zu laden, ist dies erfolgreich beim Ausführen einer 32-Bit-Anwendung, aber nicht beim Ausführen einer 64-Bit-Anwendung. Der obige Code liest die installierten Decoder aus der Registrierung korrekt.

+0

Das ist brilliant - funktioniert perfekt! –