Актуальный список встроенных фильтров Core Image? - PullRequest
0 голосов
/ 24 октября 2018

Apple Core Image Filter Reference, которая описывает все встроенные CIFilter s, помечается как «больше не обновляется».

Похоже на последний раз оно обновлялось в 2016 году. С тех пор видео WWDC на 2017 и 2018 годы объявили о дополнительных фильтрах (которые, действительно, не появляются на этой странице).

Кто-нибудь знает о более актуальныхсписок встроенных фильтров Core Image?

(Вопрос также был задан, но до сих пор не получен) на Apple Dev Forum .)

1 Ответ

0 голосов
/ 26 октября 2018

Я создал небольшой проект для запроса устройства iOS и (1) перечислил все доступные фильтры и (2) перечислил все о каждом входном атрибуте.Этот проект можно найти здесь .

Соответствующий код:

var ciFilterList = CIFilter.filterNames(inCategories: nil)

Эта строка создает [String] всех доступных фильтров.Если вам нужны только все доступные фильтры категории "CICategoryBlur", замените nil на него.

print("=======")
print("List of available filters")
print("-------")
for ciFilterName in ciFilterList {
    print(ciFilterName)
}
print("-------")
print("Total: " + String(ciFilterList.count))

Довольно очевидно.Когда я запускал это на iPad mini под управлением iOS 12.0.1, в списке было 207 фильтров.ПРИМЕЧАНИЕ: я никогда не пробовал это на macOS, но так как он действительно не использует UIKit, я считаю, что это будет работать.

let filterName = "CIZoomBlur"
let filter = CIFilter(name: filterName)
print("=======")
print("Filter Name: " + filterName)
let inputKeys = filter?.inputKeys
if inputKeys?.count == 0 {
   print("-------")
   print("No input attributes.")
} else {
   for inputKey in inputKeys! {
       print("-------")
       print("Input Key: " + inputKey)
       if  let attribute = filter?.attributes[inputKey] as? [String: AnyObject],
           let attributeClass = attribute[kCIAttributeClass] as? String,
           let attributeDisplayName = attribute["CIAttributeDisplayName"] as? String,
           let attributeDescription = attribute[kCIAttributeDescription] as? String {
               print("Display name: " + attributeDisplayName)
               print("Description: " + attributeDescription)
               print("Attrbute type: " + attributeClass)
               switch attributeClass {
               case "NSNumber":
                   let minimumValue = (attribute[kCIAttributeSliderMin] as! NSNumber).floatValue
                   let maximumValue = (attribute[kCIAttributeSliderMax] as! NSNumber).floatValue
                   let defaultValue = (attribute[kCIAttributeDefault] as! NSNumber).floatValue
                   print("Default value: " + String(defaultValue))
                   print("Minimum value: " + String(minimumValue))
                   print("Maximum value: " + String(maximumValue))
               case "CIColor":
                   let defaultValue = attribute[kCIAttributeDefault] as! CIColor
                   print(defaultValue)
               case "CIVector":
                   let defaultValue = attribute[kCIAttributeDefault] as! CIVector
                   print(defaultValue)
               default:
                   // if you wish, just dump the variable attribute to look at everything!
                   print("No code to parse an attribute of type: " + attributeClass)
                   break
               }
           }
       }
   }
}
print("=======")

Опять же, довольно очевидно.Приложение, которое я пишу, работает только с фильтрами, использующими один CIImage и с атрибутами, ограниченными NSNumber, CIColor и CIVector, поэтому вещи будут падать на часть по умолчаниюswitch заявление.Тем не менее, это должно помочь вам начать!Если вы хотите увидеть «сырую» версию, просто посмотрите на переменную attribute.

Наконец, я бы порекомендовал нечто, разработанное Саймоном Гладманом, под названием Filterpedia.Это приложение для iPad (только в альбомной ориентации), которое позволяет вам экспериментировать со практически всеми доступными фильтрами, а также со всеми атрибутами со значениями по умолчанию / max / min.Будьте в курсе двух вещей, хотя.(1) Это написано в Swift 2, но здесь есть вилка Swift 4 здесь .(2) Существует также множество пользовательских фильтров, использующих пользовательские CIKernels.

...