当前位置:  开发笔记 > IOS > 正文

iOS CIFilters实际上有效吗?

如何解决《iOSCIFilters实际上有效吗?》经验,为你挑选了1个好方法。

我目前正在尝试使用由不同CIF过滤器过滤的图片填充集合视图.我用apple方法获得了一系列过滤器.

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
}

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

[ 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

我没有检查所有剩余的过滤器.我认为数组应该只包含易于使用的flters.是错误的代码还是我使用的过滤器数组?

但是,例如第一个过滤器(CIAccordionFoldTransition)似乎是一个过渡而不是真正的过滤器.所以它的输出为零是有意义的.

有没有办法让所有过滤器适用于单张图片?

我对iOs很新鲜,我希望我的问题不是对这个主页愚蠢,善良!提前问候和感谢.



1> rob mayoff..:

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

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

过滤器通过其inputKeys属性报告其输入属性的键.它通过其attributes属性描述其所有属性.

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

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有