一个CIImage中有多个CIFilter?

时间:2013-12-26 01:43:23

标签: ios objective-c uiimage core-image cifilter

我有两个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"];

2 个答案:

答案 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];
        }];

您在上面的示例代码中提供了CIImageinputImage),然后使用过滤器的名称作为键填充NSDictionary,另一个NSDictionary (包含过滤器的输入参数)作为对象。

上面的代码列举了NSDictionary中的关键对象对;每对用于提供CIImage imageByApplyingFilter:withInputParameters方法所需的参数。