2016年4月4日 星期一

自定 CIKernel 濾鏡


坊間很多攝影程式都有形形色色的濾鏡給用戶選擇;在開發《Not-Bag》應用程式時,同事們選了一條難走的路。今次由我操刀,先看看現成有哪些可行方案選擇,再決定應該如何做。

自從 iOS 8 開始,編程人員已經可以為 CoreImage 自定 Kernel。我試了一下。找來一個名叫《Sweetcorn》的開源程式,以視覺方式自行組合濾鏡,看到效果之餘,還生成 Kernel 用的代碼。把代碼加到程式中,便能在 iOS 上實現相同的濾鏡效果:
NSString *string = @"kernel vec4 color(__sample pixel)  {"\
                   @"   float var_2 = sqrt(pixel.b);"\
                   @"   float var_6 = 2.5;"\
                   @"   float var_4 = pow(pixel.r, var_6);"\
                   @"   return vec4(var_4, pixel.g, var_2, 1.0);"\
                   @}";

CIKernel *kernel = [CIKernel kernelWithString:string];
UIImage *image = [UIImage imageNamed:@"sita.jpg"];

CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
CIImage *outputImage = [kernel applyWithExtent:inputImage.extent roiCallback:^CGRect(int index, CGRect rect)  {
    return inputImage.extent;
} arguments:@[inputImage]];

image = [UIImage imageWithCIImage:outputImage];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView setCenter:self.view.center];
[self.view addSubview:imageView];

沒有留言: