iOS CIFilters 到底有什么用?

iOS CIFilters which actually do work?

我目前正在尝试使用由不同的 CIFilters 过滤的图片来填充集合视图。 我用苹果的方式来获取一组过滤器。

let filterNames = CIFilter.filterNamesInCategories([kCICategoryStillImage,kCICategoryBuiltIn])

我认为这应该为我提供适用于 iPhone 上静止图像的所有滤镜。 但这有点行不通。

这是我通过上述方法获得的(一些)过滤器:

["CIAccordionFoldTransition", "CIAdditionCompositing", "CIAffineClamp", "CIAffineTile", "CIAffineTransform", "CIAreaAverage", "CIAreaHistogram", "CIAreaMaximum", "CIAreaMaximumAlpha", "CIAreaMinimum", "CIAreaMinimumAlpha", "CIAztecCodeGenerator", "CIBarsSwipeTransition", "CIBlendWithAlphaMask", "CIBlendWithMask", "CIBloom", "CIBoxBlur", "CIBumpDistortion", "CIBumpDistortionLinear", "CICheckerboardGenerator", "CICircleSplashDistortion", "CICircularScreen", "CICircularWrap", "CICMYKHalftone", 

还有很多。

我用这种方法应用过滤器:

func applyFilter(image: UIImage, filterName: String) -> UIImage {

    let beginImage = CIImage(CGImage: image.CGImage!)

    let filter = CIFilter(name: filterName)!

    filter.setValue(beginImage, forKey: kCIInputImageKey)

    filter.setDefaults()

    let context = CIContext(options: nil)
    let imageRef = context.createCGImage(filter.outputImage!, fromRect: beginImage.extent)

    let newImage = UIImage(CGImage: imageRef)
    return newImage
}

前两个过滤器无法工作,因为生成的图像为零,然后一些工作,然后我得到:

[<CIAztecCodeGenerator 0x7fb89c775460> setValue:forUndefinedKey:]: this     class is not key value coding-compliant for the key inputImage.'
*** First throw call stack:
(
0   CoreFoundation                      0x000000010cd5de65     __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x000000010efebdeb    objc_exception_throw + 48
2   CoreFoundation                      0x000000010cd5daa9 -   [NSException raise] + 9
3   CoreImage                           0x000000010d33eea2 -[CIFilter setValue:forUndefinedKey:] + 137
4   CoreImage                           0x000000010d4093ce -[CIAztecCodeGenerator setValue:forUndefinedKey:] + 335
5   Foundation                          0x000000010d6749bb -[NSObject(NSKeyValueCoding) setValue:forKey:] + 288
6   DrawIt                              0x000000010cb55088 _TFC6DrawIt25applyFilterViewController11applyFilterfS0_FTCSo7UIImage10filterNameSS_S1_ + 552
7   DrawIt                              0x000000010cb54b52 _TFC6DrawIt25applyFilterViewController14collectionViewfS0_FTCSo16UICollectionView22cellForItemAtIndexPathCSo11NSIndexPath_CSo20UICollectionViewCell + 1186
8   DrawIt                              0x000000010cb54e3f _TToFC6DrawIt25applyFilterViewController14collectionViewfS0_FTCSo16UICollectionView22cellForItemAtIndexPathCSo11NSIndexPath_CSo20UICollectionViewCell + 79
9   UIKit                               0x000000010e31d5ba -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:] + 483
10  UIKit                               0x000000010e31fae0 -[UICollectionView _updateVisibleCellsNow:] + 4431
11  UIKit                               0x000000010e32423b -[UICollectionView layoutSubviews] + 247
12  UIKit                               0x000000010db7f4a3 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
13  QuartzCore                          0x0000000113d0059a -[CALayer layoutSublayers] + 146
14  QuartzCore                          0x0000000113cf4e70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
15  QuartzCore                          0x0000000113cf4cee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
16  QuartzCore                          0x0000000113ce9475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
17  QuartzCore                          0x0000000113d16c0a _ZN2CA11Transaction6commitEv + 486
18  QuartzCore                          0x0000000113d259f4 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 576
19  CoreFoundation                      0x000000010ccbdc84 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
20  CoreFoundation                      0x000000010ccbd831 __CFRunLoopDoTimer + 1089
21  CoreFoundation                      0x000000010cc7f241 __CFRunLoopRun + 1937
22  CoreFoundation                      0x000000010cc7e828 CFRunLoopRunSpecific + 488
23  GraphicsServices                    0x0000000113bc8ad2 GSEventRunModal + 161
24  UIKit                               0x000000010dac8610 UIApplicationMain + 171
25  DrawIt                              0x000000010cb569fd main + 109
26  libdyld.dylib                       0x000000010faf492d start + 1
27  ???                                 0x0000000000000001 0x0 + 1
)
 libc++abi.dylib: terminating with uncaught exception of type NSException

我没有检查所有其他过滤器。 我认为数组应该只包含适用的过滤器。 是代码错误还是我使用的过滤器数组?

但是例如第一个过滤器 (CIAccordionFoldTransition) 似乎是一个过渡而不是真正的过滤器。所以它有一个 nil 作为输出是有道理的。

有没有办法像这样获取适用于单张图片的所有滤镜?

我对 iOs 很陌生,我希望我的问题对这个主页来说不是愚蠢的,请客气! 提前问候和感谢。

CIFilter.filterNamesInCategories 返回的一些过滤器具有 inputImage 属性,有些则没有。

例如,CIAztecCodeGenerator 理解的属性(在您的异常报告中提到)列在 here 中,而 inputImage 不是其中之一。

过滤器通过其 inputKeys property. It describes all of its attributes through its attributes property.

报告其输入属性的键

也许您想将过滤器限制为具有 inputImage 属性的过滤器:

let filterNames = CIFilter.filterNamesInCategories([kCICategoryStillImage,kCICategoryBuiltIn])
    .filter { CIFilter(name: [=10=])?.inputKeys.contains("inputImage") ?? false }