44459


環境  
Windows10 64bit April 2018 Update  
VisualStudio 2017  
.Net Framework 4.6.2  
WPF

[HEIF Image Extensions](https://www.microsoft.com/ja-jp/p/heif-image-
extensions/9pmmsr1cgpwg) をインストールすることで .heic
画像ファイルもデコードできるようになったのですが、以前解決した方法([BitmapDecoder
がサポートしている画像ファイルの種類(拡張子)を全て取得したい](https://ja.stackoverflow.com/questions/23202/bitmapdecoder-%E3%81%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E5%85%A8%E3%81%A6%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84))では、この拡張子が取得できません。

ストアからインストールしてデコードできるようになった画像の拡張子も取得したいのですが、どのようにすればよいのでしょうか。


CC BY-SA 4.0
2018-06-01T05:59:13.840
44449
2018-06-01T23:28:53.867
14817
question
c# .net wpf
BitmapDecoder がサポートしている画像ファイルの種類(拡張子)を全て取得したい (.heicとか)


C#で実装するには必要な情報が提供されていません。Windows SDKに含まれているC++ヘッダーファイル `wincodec.h` の情報が必要です。

[code]

    #include <iostream>
    #include <iterator>
    #include <wrl/client.h>
    #include <Windows.h>
    #include <wincodec.h>
    template<class T> using ComPtr = Microsoft::WRL::ComPtr<T>;
    
    void check(HRESULT hr) { if (FAILED(hr)) throw hr; }
    
    int main() {
        struct Com {
            Com() { check(CoInitialize(nullptr)); }
            ~Com() { CoUninitialize(); }
        } com;
        ComPtr<IWICImagingFactory> imageingFactory;
        check(CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&imageingFactory)));
        ComPtr<IEnumUnknown> enumUnknown;
        check(imageingFactory->CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumUnknown));
        for (ComPtr<IUnknown> unknown; enumUnknown->Next(1, &unknown, nullptr) == S_OK;) {
            ComPtr<IWICBitmapCodecInfo> codecInfo;
            check(unknown.As(&codecInfo));
            wchar_t friendlyName[1024], fileExtensions[1024];
            UINT actual;
            check(codecInfo->GetFriendlyName(static_cast<UINT>(std::size(friendlyName)), friendlyName, &actual));
            check(codecInfo->GetFileExtensions(static_cast<UINT>(std::size(fileExtensions)), fileExtensions, &actual));
            std::wcout << friendlyName << L": " << fileExtensions << std::endl;
        }
        return 0;
    }
    
[/code]

実行するとこんな感じで、レジストリでは得られなかったコーデックについてもリストされます。

[code]

    BMP Decoder: .bmp,.dib,.rle
    GIF Decoder: .gif
    ICO Decoder: .ico,.icon
    JPEG Decoder: .jpeg,.jpe,.jpg,.jfif,.exif
    PNG Decoder: .png
    TIFF Decoder: .tiff,.tif
    DNG Decoder: .dng
    WMPhoto Decoder: .wdp,.jxr
    DDS Decoder: .dds
    Microsoft HEIF Decoder: .heic,.heif,.heics,.avcs,.heifs
    Microsoft Camera Raw Decoder: .ARW,.CR2,.CRW,.ERF,.KDC,.MRW,.NEF,.NRW,.ORF,.PEF,.RAF,.RAW,.RW2,.RWL,.SR2,.SRW,.DNG
    
[/code]

挙げたコードはもちろんC++言語ですが、C#言語に移植するのは大変なのでやめておきます。


CC BY-SA 4.0
2018-06-01T23:28:53.867
44459
2018-06-01T23:28:53.867
4236
44449
answer