2016-04-03 2 views
3

Как получить список форматов изображений, поддерживаемых System.Windows.Media.Imaging.BitmapImage?Получить поддерживаемые форматы изображений из BitmapImage

Я пишу простой инструмент обработки изображений в C# WPF. Класс BitmapImage является одним из наиболее полезных классов растровых изображений, поскольку он способен декодировать из самых разных форматов.

В частности, он может открывать NEF (формат RAW от Nikon) на моем компьютере. Вероятно, BitmapImage может открыть широкий спектр форматов RAW от других производителей, функцию, которую я очень хочу использовать.

Поскольку я не знаю каждого формата, который можно открыть как BitmapImage, в настоящее время я использую try/catch, чтобы попытаться построить BitmapImage из каждого файла, который пользователь пытается открыть. Это явно не самый эффективный способ.

Насколько я знаю, BitmapImage наследует от BitmapSource, который решает which files it can open by looking on the user's system for available codecs. Вероятно, поэтому доступность кодеков варьируется между машинами, то есть список поддерживаемых форматов не может быть жестко закодирован в программу. Мне нужен способ проверить, что эти поддерживаемые форматы на машине пользователя.

Я нашел this method в System.Drawing. Это возвращает список поддерживаемых кодеков со списком поддерживаемых расширений файлов, а эквивалент для System.Windows.Media.Imaging - именно то, что мне нужно.

+2

[Этот ответ] (http://stackoverflow.com/a/8343497/1136211) может быть интересным. – Clemens

ответ

2

Если вы не хотите иметь дело с WIC напрямую, как показано в исходном коде, связанном с ответом, упомянутым Clemens, вы можете прочитать список дополнительных кодеков (тех, которые по умолчанию не поддерживаются 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 у меня есть Photoshop-декодер от Microsoft, установленный для чтения файлов psd. Однако установлена ​​только 32-разрядная версия.

Итак, когда я пытаюсь загрузить файл psd Photoshop с помощью BitmapImage, это удается при запуске 32-разрядного приложения, но не при использовании 64-разрядного приложения. Приведенный выше код, считывающий установленные декодеры из реестра, отражает это правильно.

+0

Это великолепно - отлично работает! –

Смежные вопросы