我有两个CIF过滤器,曝光和色调。我需要将过滤器组合在一个UIImage上。我该怎么办呢?下面是我到目前为止的一些代码......
CIFilter *hueFilter;
CIFilter *exposureFilter;
CIImage *adjustedImage;
hueFilter = [CIFilter filterWithName:@"CIHueAdjust"];
exposureFilter = [CIFilter filterWithName:@"CIExposureAdjust"];
[hueFilter setValue:[NSNumber numberWithFloat:5] forKey: @"inputAngle"];
[exposureFilter setValue:[NSNumber numberWithFloat:5] forKey: @"inputEV"];
adjustedImage = [CIImage imageWithCGImage:inputCGImage];
[hueFilter setValue:adjustedImage forKey:@"inputImage"];
[exposureFilter setValue:adjustedImage forKey:@"inputImage"];
答案 0 :(得分:8)
核心图像过滤器可以一个接一个地链接在一起。如果用这个想法写的话,我发现代码更容易阅读(和写)。
CIFilter *hueFilter;
CIFilter *exposureFilter;
CIImage *inputImage; // assume this has already been created
CIImage *outputImage;
hueFilter = [CIFilter filterWithName:@"CIHueAdjust"];
[hueFilter setValue:inputImage forKey:kCIInputImageKey];
[hueFilter setValue:[NSNumber numberWithFloat:5] forKey:@"inputAngle"];
outputImage = [hueFilter valueForKey:kCIOutputImageKey];
exposureFilter = [CIFilter filterWithName:@"CIExposureAdjust"];
[exposureFilter setValue:outputImage forKey:kCIInputImageKey];
[exposureFilter setValue:[NSNumber numberWithFloat:5] forKey:@"inputEV"];
outputImage = [exposureFilter valueForKey:kCIOutputImageKey];
在上面,创建了第一个过滤器。请注意在可用的键中使用常量。在块的结尾处,已经为图像设置了滤镜,但是在渲染图像之前实际上不执行计算。应用的任何新过滤器将被组合以实现最有效的操作。
然后下一个块应用下一个过滤器,使用第一个过滤器的输出作为第二个过滤器的输入。这可以根据需要重复多次。通过编写上面的代码,您可以根据需要轻松打开/关闭过滤器,如果有多个过滤器,甚至可以重新排序。
Apple的文档非常好,有很多例子:Core Image Programming Guide。
答案 1 :(得分:1)
这是在没有递归的情况下链接Core Image过滤器的最简单,最简洁的方法:
NSDictionary *filters = @{
@"CIScreenBlendMode" : @{kCIInputImageKey : inputImage, kCIInputBackgroundImageKey : inputImage},
@"CIOverlayBlendMode" : @{kCIInputImageKey : inputImage, kCIInputBackgroundImageKey : inputImage},
@"CIMultiplyBlendMode" : @{kCIInputImageKey : inputImage, kCIInputBackgroundImageKey : inputImage}
};
[filters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
inputImage = [inputImage imageByApplyingFilter:key withInputParameters:obj];
}];
您在上面的示例代码中提供了CIImage
(inputImage
),然后使用过滤器的名称作为键填充NSDictionary
,另一个NSDictionary
(包含过滤器的输入参数)作为对象。
上面的代码列举了NSDictionary
中的关键对象对;每对用于提供CIImage imageByApplyingFilter:withInputParameters
方法所需的参数。