Core Imageで遊んでみる
Xcode4.2 からStoryboardが追加されたたのはいいですが、今までのノリでViewを開いたりしようとしても全く動かず、イチからアプリを作ろうとしたら思わずハマッてしまった。。
思わぬところで躓いた訳ですが、本当にやりたかったのはCore Imageの勉強です。
Core ImageはiOS 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 に置き換えつつ、輝度を反映してあげる必要があります。
前に買った本、「ディジタル画像処理」には、数式とか載っていたのですが、これをコードにおこすのもモノクロ、セピアぐらいならいいけど、結構しんどい。
- 出版社/メーカー: CGーARTS協会
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 13人 クリック: 142回
- この商品を含むブログ (16件) を見る
では、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