轻松异步应用一系列 CoreImage
过滤器。纯粹的快乐。
- (void)processImage
{
UIImage *img = [UIImage imageNamed:@"TestImage.jpg"];
[self.greyscaleAndPixelate processImage:img completion:^(UIImage *result, NSError *error) {
[self.imageView setImage:result];
}];
}
- (IMOFilterStack *)greyscaleAndPixelate
{
return [IMOFilterStack withFilters:@[ [CIFilter filterWithName:@"CIPhotoEffectNoir"],
[CIFilter filterWithName:@"CIPixellate"]
]];
}
因为这很酷。代码更少。可重用。声明式。
通常您需要重复以下步骤来使用 CoreImage
过滤器处理 UIImage
:
CIImage
CIImage
转回正确的 UIImage
(即基于 CIImage
或 CGImage
的)IMOFilterStack
实现了所有这些步骤。现在您只需要声明性地描述一个过滤器链。《惊奇》!就这么简单。
按照这种方式声明一个过滤器链:
- (IMOFilterStack *)imageBeautifier
{
return [IMOFilterStack withFilters:@[ [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputEVKey, @(0.10f), nil],
[CIFilter filterWithName:@"CIVibrance" keysAndValues:@"inputAmount", @(0.10f), nil]
]];
}
lazy var beautifier: IMOFilterStack = {
return IMOFilterStack(filters: [
CIFilter(name: "CIExposureAdjust", withInputParameters: [kCIInputEVKey : NSNumber(double: 0.10)]),
CIFilter(name: "CIVibrance", withInputParameters: ["inputAmount" : NSNumber(double: 0.10)])
])
}()
然后像这样使用它:
[self.imageBeautifier processImage:photo completion:^(UIImage *result, NSError *error) {
[self.handler processedPhoto:result originalPhoto:photo];
}];
self.beautifier.processImage(photo) { (result, error) in
self.handler?.processedPhoto(result, originalPhoto: photo)
}
completion
块在主线程上触发。如果您想改变这一点,提供您自己的 NSOperationQueue
实例用于回调。
您还可以提供(或调整)处理过程的 NSOperationQueue
(例如,设置 QoS)。
IMOFilterStack
是线程安全的(已报告存在关于多个 CIFilter
实例的线程安全问题,但我还没有重现它们)。IMOFilterStack
尝试尽最大努力,在每个处理操作上运行原始过滤器数组的深度副本。
这就是所有的内容,大家。请自由地提出问题,分支和发送拉取请求。
开心地处理吧!
Ivan Moskalev,[email protected]
IMOFilterStack 在 MIT 许可下可用。更多信息请查看 LICENSE 文件。