我目前正在尝试使用由不同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很新鲜,我希望我的问题不是对这个主页愚蠢,善良!提前问候和感谢.
返回的一些过滤器CIFilter.filterNamesInCategories
具有inputImage
属性,而有些则没有.
例如,此处CIAztecCodeGenerator
列出了(在您的异常报告中提到)理解的属性,而不是其中之一.inputImage
过滤器通过其inputKeys
属性报告其输入属性的键.它通过其attributes
属性描述其所有属性.
也许您希望将过滤器限制为具有inputImage
属性的过滤器:
let filterNames = CIFilter.filterNamesInCategories([kCICategoryStillImage,kCICategoryBuiltIn]) .filter { CIFilter(name: $0)?.inputKeys.contains("inputImage") ?? false }