Core Imageで遊んでみる

Xcode4.2 からStoryboardが追加されたたのはいいですが、今までのノリでViewを開いたりしようとしても全く動かず、イチからアプリを作ろうとしたら思わずハマッてしまった。。


思わぬところで躓いた訳ですが、本当にやりたかったのはCore Imageの勉強です。


Core ImageiOS 5から使えるようになったもので、元々はMac OS X(10.4)で導入されたものです。
OS Xで使える機能がすべてiOSで使えるわけではありませんが、それでもいままで地味に1ピクセルずつ計算して画像をいじる必要がなくなりました。


Appleのドキュメントを見るとCore Image Filter Reference、たくさんのフィルターが用意されていますが、実際には「Available in Mac OS X v10.4 and later and in iOS 5.0 and later.」と書かれているものだけが、iOSで使えるものです。



例えば、自分で写真をセピア調にしたいと思ったら、1ピクセルずつセピア色に変換すればいいわけですが、なんだかめんどくさそうな予感です。
Wikipediaを見るとセピア色は「#6B4A2B」と定義されているので、各ピクセルを、R:107、G:74、B:43 に置き換えつつ、輝度を反映してあげる必要があります。


前に買った本、「ディジタル画像処理」には、数式とか載っていたのですが、これをコードにおこすのもモノクロ、セピアぐらいならいいけど、結構しんどい。

ディジタル画像処理

ディジタル画像処理

では、Core Imageを使うとどうかというと、セピア調に変換するフィルタ「CISepiaTone」が用意されています。

入力パラメータはたったの2つ。
画像(CIImage)と、輝度(NSNumber)。
輝度は、0.0〜1.0の範囲で指定できるので、この値を調整して自分の気に入った度合いにしてあげます。

サンプルソース

    CIImage *inImage = [[CIImage alloc] initWithImage:self.orgImage.image];
    
    CIContext *context = [CIContext contextWithOptions:nil];
    
    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, inImage, 
                                    @"inputIntensity", [NSNumber numberWithFloat:[(UISlider *)sender value]], nil];
    CIImage *outputImage = [filter outputImage];
    
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];
    
    [self.filterImage setImage:newImg];
    
    CGImageRelease(cgimg);    

フィルターを適用する前とした後の比較


フィルターが便利なところは、更に別のフィルターを適用することによって、更に画像を加工できること。

セピアに変換した後に、「CIVignette」のフィルターを充てることで、instagram風の画像ができました。

今回作成したサンプルのソースはgithubに上げてあります。
https://github.com/sparkgene/sepiaFilter