2015-12-27 4 views
2

В настоящее время я пытаюсь заполнить коллекцию с изображением, которое фильтруется различными CIFilters. Я использовал метод яблок для получения массива фильтров.iOS 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 

I не проверял все остальные фильтры. Я думал, что массив ДОЛЖЕН содержать только флитеры, которые применимы легко. Это неправильный код или массив фильтров, которые я использую?

Но, к примеру, первый фильтр (CIAccordionFoldTransition) кажется переходным, а не фильтром. Таким образом, имеет смысл, что он имеет нулевое значение.

Есть ли способ получить все фильтры, которые применимы к одной картинке именно так?

Я довольно свежий в iOs, и я надеюсь, что мой вопрос не глуп для этой домашней страницы, будьте добрыми! Поздравления и благодарности.

ответ

5

Некоторые из фильтров, возвращаемых CIFilter.filterNamesInCategories, имеют атрибут inputImage, а некоторые нет.

Например, атрибуты, понятные CIAztecCodeGenerator (упомянутые в вашем отчете об исключении), перечислены here, а inputImage не является одним из них.

Фильтр передает ключи для своих входных атрибутов через свой inputKeys property. Он описывает все его атрибуты через его attributes property.

Может быть, вы хотите ограничить фильтры для тех, которые имеют inputImage атрибуты:

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

Спасибо большое, будет пытаться это! Например, сложение аккордеона имеет входное изображение, но я предполагаю, что он не имеет Output (is nil), потому что это переход, есть ли способ проверить это? Поскольку ключ есть, он просто ничего не возвращает. Может быть, я должен скомпилировать свой собственный массив с рабочим фильтром, используя некоторые уловы? – Marcel

+0

yup спасибо большое ваше решение держит вне одну ошибку, но я наклоняю, кажется, найти любой список или объяснение, что фильтр делает то, что ... Я просто могу попробовать их .. – Marcel

+0

[Ссылка на основной фильтр] (https: // developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP40004346) (выпуск iOS). –

Смежные вопросы