CoreImageで画像の加工をする その1「準備から実行」

iOSのアプリで画像の加工をする場合、いくつか選択肢がありますがPhotompyで使っているCoreImageの簡単な使い方を紹介してみます。

CoreImageはAppleが提供しているAPIで、OSXやiOSで使う事ができます。ですがiOSでは使えるフィルタが限られているので注意が必要です。

使えるフィルタについてはリファレンスを参照するのが手っ取り早いです。

 

CoreImageを使う為にライブラリを追加します。手順は下記の通り

  1. projectのtargetからBuild Phasesを選択しLink Binary With Librariesの+ボタンを押してCoreImage.frameworkを追加します

    f:id:ojukog:20130413150112j:plain

  2. ヘッダファイルに下記のコードを追加
    #include <CoreImage/CoreImage.h>

これで準備は整ったので実際に加工します。

画像はこれを使ってみます

f:id:ojukog:20130413150546p:plain

 

この画像をモノクロにしてみます

-(void)effectSample{
    UIImage *targetImage = [UIImage imageNamed:@"sample.png"];
    targetImage = [self effectMono:targetImage];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:targetImage];
    
    [self.view addSubview:imageView];
}

-(UIImage *)effectMono:(UIImage *)targetImage{
    
    CIImage *ciImage = [[CIImage alloc] initWithImage:targetImage];
    
    CIFilter *ciFilter = [CIFilter filterWithName:@"CIColorMonochrome"
                                    keysAndValues:kCIInputImageKey, ciImage,
                          @"inputColor", [CIColor colorWithRed:0.75 green:0.75 blue:0.75],
                          @"inputIntensity", [NSNumber numberWithFloat:1.0],
                          nil
                          ];
    
    NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool:NO],kCIContextUseSoftwareRenderer,nil];
    
    CIContext *ciContext = [CIContext contextWithOptions:contextOptions];
    CGImageRef cgImageRef = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]];
    UIImage* resultImage = [UIImage imageWithCGImage:cgImageRef];
    CGImageRelease(cgImageRef);
    
    return resultImage;
}

エフェクトをかける際に肝になるのはCIFilterの設定です。その他の設定はひとまず置いておきます。

使いたいフィルタや設定できる値などは全てリファレンスに書かれていますので、そちらを参照して任意の値を設定するようにして下さい。

例えば上記例ではinputColorやinputIntensityの値を弄る事でかかるエフェクトの結果が変わってきます。

とりあえず上記例をそのまま実行すると

 

f:id:ojukog:20130413152831j:plain

こんな感じに加工できました。

他にもフィルタは用意されているので色々試してみるのも面白いと思います