CIFilter工作不正常,返回空映像

嘿,我一直在使用一些filter。 并不是所有的人都像CISepiaTone和CIHueAdjust那样正常工作。 最近我尝试了CIGLoomfilter,它返回一个空的图像。

-(UIImage*)getGloom:(UIImage*)anImage{ CGImageRef cgimage = anImage.CGImage; CIImage *cimage = [CIImage imageWithCGImage:cgimage]; CIFilter *filter = [CIFilter filterWithName:@"CIGloom"]; [filter setDefaults]; [filter setValue: cimage forKey: @"inputImage"]; [filter setValue: [NSNumber numberWithFloat: 25] forKey: @"inputRadius"]; [filter setValue: [NSNumber numberWithFloat: 0.75] forKey: @"inputIntensity"]; CIContext *context = [CIContext contextWithOptions:nil]; CIImage *ciimage = [filter outputImage]; CGImageRef cgimg = [context createCGImage:ciimage fromRect:[ciimage extent]]; UIImage *uimage = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp]; CGImageRelease(cgimg); return uimage; } 

我实际上从今年的techtalk世界巡演中得到了这个代码,它适用于CISepiaTone,但它只是没有为cigloom。 cicolorposterize,ciedges和其他一些。 任何人都知道为什么? 或如何解决这个NUll图像?

CIGloom以及其他您遇到的问题在iOS上尚不受支持。 你可以使用这个数组结果来检查你可用的filter:

 NSArray *supportedFilters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; 

是的,似乎有些filter不适用于iOS。 阅读文档时有同样的乐趣。 但是,您可以使用代码来检查iOS的可用filter,如上面的说明。 一些filter,例如CIVingette,我没有在文档中find,我这样做也为iOS上的每个可用的filter获取值的参数5.1。

 NSArray *supportedFilters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; for (CIFilter *filter in supportedFilters) { NSString *string = [NSString stringWithFormat:@"%@",[[CIFilter filterWithName:(NSString *)filter] inputKeys]]; NSLog(@"%@ %@", filter, string); } 

响应:

 ...
 2012-04-19 14:02:55.597 ImageFiltering [12190:707] CIVibrance(
     inputImage的,
     inputAmount
 )
 2012-04-19 14:02:55.599 ImageFiltering [12190:707] CIVignette(
     inputImage的,
     inputIntensity,
     inputRadius
 )
 2012-04-19 14:02:55.601 ImageFiltering [12190:707] CIWhitePointAdjust(
     inputImage的,
     inputColor
 )
 ...

请注意,将来(或者已经知道你可以阅读更多的信息),你可能要阅读文档。 这只是我玩侦探,以避免它,因为我没有find任何文件的一些filter,我刚才提到。

这里是一个例子,我从以前的信息与CIVingette出来:

 - (void)displayVingetteFilterWithImage {
     //获取图像并将其设置为CIImage
     NSString * filePath = [[NSBundle mainBundle] pathForResource:@“image_1”ofType:@“jpg”];
     NSURL * fileNameAndPath = [NSURL fileURLWithPath:filePath];
     CIImage * image = [CIImage imageWithContentsOfURL:fileNameAndPath];

     //创build上下文 
     CIContext * imageContext = [CIContext contextWithOptions:nil];

     //将filter设置为图像,在这种情况下,CIVignette知道它使用前一个日志响应中的inputImage,inputIntensity和inputRadius。
     CIFilter * vignette = [CIFilter filterWithName:@“CIVignette”];
     [vignette setDefaults];
     [vignette setValue:image forKey:@“inputImage”];
     [vignette setValue:[NSNumber numberWithFloat:5.0] forKey:@“inputIntensity”];
     [vignette setValue:[NSNumber numberWithFloat:30.0] forKey:@“inputRadius”];

     //将CIImage附加到CGImageRef并将其附加为UIImage
     CIImage * result = [vignette valueForKey:@“outputImage”];
     CGImageRef cgImageRef = [imageContext createCGImage:result fromRect:[result extent]];
     UIImage * targetImage = [UIImage imageWithCGImage:cgImageRef];

     //将UIImage附加到UIImageView的self.view中,并将其定位,以获得乐趣。
     UIImageView * imageView = [[UIImageView alloc] initWithImage:targetImage];
     [self.view addSubview:imageView];
     [imageView setImage:targetImage];
     imageView.frame = CGRectMake(0.0,10.0,imageView.frame.size.width,imageView.frame.size.height);

     //释放我们之前创build的CGImageRef。
     CGImageRelease(cgImageRef);
 }