Sweets Junkie

もぅマヂ無理。ムズかしぃコト。。。ぉぼぇてらんなぃから。。。ブログかコ。。。デザィンみづらくてぇ。。。それどころじゃなぃ。。。

【C#】CMYK形式の画像ファイルをRGB形式に変換する

印刷するわけでもないのに、なぜCMYK形式の画像ファイルが紛れているのか…。

文句言ってもしかたないので、変換する処理を実装してみた。
例の如く情報が少ないのでリファレンスと超睨めっこしたけど、日本語のリファレンスがあるだけましか…。

public class ConvertColorMode
{
    /// <summary>
    /// CMYK形式の画像ファイルをRGB形式に変換する。
    /// </summary>
    /// <param name="src">元画像のパス</param>
    /// <param name="dest">変換後のパス</param>
    public void Convert(String src, String dest)
    {
        using (FileStream stream = new FileStream(src, FileMode.Open))
        {
            // 変換はColorConvertedBitmapで行う。
            BitmapSource source = BitmapFrame.Create(stream);
            BitmapFrame frame = (BitmapFrame)source;
            ColorContext srcColor = frame.ColorContexts[0];
            ColorContext destColor =
                new ColorContext(PixelFormats.Bgra32);
            ColorConvertedBitmap ccb = new ColorConvertedBitmap(
                source,
                srcColor,
                destColor,
                PixelFormats.Bgr32);

            // Bitmapに変換してから出力する。
            MemoryStream ms = new MemoryStream();
            BitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(ccb));
            encoder.Save(ms);
            Bitmap bitmap = new Bitmap(ms);
            bitmap.Save(dest);
        }
    }
}

見ての通り変換処理はColorConvertedBitmapを使用しておこなう。
コンストラクタの引数にたくさん変数を渡しているけど、第3引数と第4引数で目的のカラーモードを指定している。
上記の実装ではCMYKRGBの変換だけど、引数を切り替えればRGBCMYKの変換もおこなうことができる。

画像ファイルはJPGの想定なのでJPG形式でエンコードして、Bitmapに変換して出力している。
実は、変換部分より出力方法のがわからなくて結構悩んだ…。