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); }