カラーマネジメント

WICでは、カラーマネジメントシステム(CMS)の利用もかなり簡単になっており、これらは、IWICColorTransformを利用して行う。また、上記のサンプルで、IWICBitmapFrameDecodeがIWICBitmapSourceにキャスト(QueryInterface)可能だったように、IWICColorTransformもIWICBitmapSourceにキャスト可能である。これによって、入力画像に複数の加工を加えて最終出力を得ることができるようになっている。

次の例は、読み込んだ形式がどんな形式であれ、sRGBに変換するコード。ただし、元画像にはカラープロファイルがついていることが前提*1

UINT ret;

// 入力側のカラープロファイルを取得
CComPtr<IWICColorContext> srcCc;
frameDecode->GetColorContexts(1, &srcCc, &ret);

// sRGBのカラープロファイルを作成
CComPtr<IWICColorContext> dstCc;
imagingFactory->CreateColorContext(dstCc);
dstCc->InitializeFromExifColorSpace(1);

// sRGBに変換するトランスフォームの作成
CComPtr<IWICColorTransform> transform;
imagingFactory->CreateColorTransformer(&transform);
transform->Initialize(frameDecode, srcCc, dstCc, GUID_WICPixelFormat24bppBGR);

もし、カラープロファイルがないようだったら、無理矢理変換することも可能だ。ただし、CMYK->RGBなどの変換までちゃんと行えるかどうかについては見検証。

CComPtr<IWICFormatConverter> converter;
imagingFactory->CreateFormatConverter(&converter);

converter->Initialize(
  frameDecode,GUID_WICPixelFormat24bppBGR,
  WICBitmapDitherTypeNone,
  NULL,
  0.0,
  WICBitmapPaletteTypeCustom);

*1:.NET Framework上では、PixelFormatからColorContextを作成することができるのだが、残念ながら、COM上のAPIでは、sRGB, scRGBのColorContextしか作れない