[英]Objective C: CIFilter returning nil image
我正在编写一个函数,该函数将对图像应用过滤器并返回新图像。 我写了以下代码:
+ (UIImage*)applyFilter:(UIImage*) photo {
CIImage *image = [[CIImage alloc] initWithCGImage:photo.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIphotoEffectTransfer"
keysAndValues: kCIInputImageKey, image,
@"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];
UIImage* newPhoto = [self imageFromCIImage:outputImage];
return newPhoto;
}
我遇到的问题是该函数返回的是nil照片,而不是应用了滤镜的照片。 有趣的是,如果我将过滤器名称更改为@“ CIVignetteEffect”,它将起作用。 我不明白为什么一个过滤器有效,而另一个过滤器无效。 我从以下链接中找到了两个过滤器: https : //developer.apple.com/library/tvos/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectTransfer
我相信过滤器的正确名称是CIPhotoEffectTransfer,而不是CIphotoeffectTransfer。
尝试下面的代码...我过去曾将其用于照片过滤,所以我知道它可以工作:
+ (UIImage*)applyFilter:(UIImage*) photo {
UIImageOrientation orientation = photo.imageOrientation;
CIImage* image = [CIImage imageWithCGImage:photo.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectTransfer"];
[filter setValue:image forKey:kCIInputImageKey];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newPhoto = [UIImage imageWithCGImage:cgimg scale:1.0 orientation:orientation];
CGImageRelease(cgimg);
context = nil;
return newPhoto;
}
尝试这个 ,
我们已经实现了CIFilter效果,
//CIVignette Effect
CIContext *imageContext = [CIContext contextWithOptions:nil];
CIImage *image = [[CIImage alloc] initWithImage:inputimage];
CIFilter *vignette = [CIFilter filterWithName:@"CIVignette"];
[vignette setDefaults];
[vignette setValue: image forKey: @"inputImage"];
[vignette setValue: [NSNumber numberWithFloat: 1.0] forKey: @"inputIntensity"];
[vignette setValue: [NSNumber numberWithFloat: 10.00 ] forKey: @"inputRadius"];
CIImage *result = [vignette valueForKey: @"outputImage"];
CGImageRef cgImageRef = [imageContext createCGImage:result fromRect:[result extent]];
UIImage *targetImage = [UIImage imageWithCGImage:cgImageRef];
有关多重效果的详细实现,可以参考此GitHub项目文件ImageFilter。
希望这样的答案会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.