Не удается получить код AVPortraitEffectsMatte для работы - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь следовать некоторому коду, предоставленному Apple, для извлечения маски изображения из фотографий в портретном режиме с использованием некоторых новых классов и объектов, представленных в iOS 12. Код здесь:

https://developer.apple.com/documentation/avfoundation/avportraiteffectsmatte/extracting_portrait_effects_matte_image_data_from_a_photo

func portraitEffectsMatteImageAt(_ path: String) -> UIImage? {
    let bundlePath = Bundle.main.bundlePath

    // Check that the image at given path contains auxiliary PEM data:
    guard let fileURL = NSURL(fileURLWithPath: bundlePath).appendingPathComponent(path),
    let source = CGImageSourceCreateWithURL(fileURL as CFURL, nil),
    let auxiliaryInfoDict = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypePortraitEffectsMatte) as? [AnyHashable: Any],
    let matteData = try? AVPortraitEffectsMatte(fromDictionaryRepresentation: auxiliaryInfoDict),
    let matteCIImage = CIImage(portaitEffectsMatte: matteData)
    else {
        return nil
    }
    return UIImage(ciImage: matteCIImage)
}

Мое единственное изменение заключается в основном в изменении fileURL для использования jpg в моем комплекте.:

guard let fileURL = Bundle.main.url(forResource: "custom00", withExtension: "jpg")

Однако пошаговое выполнение кода позволяет мне увидеть, что присвоение auxiliaryInfoDict равно nil.Я импортировал эти JPG из предыдущего проекта, в котором для создания масок глубины использовались более старые методы (https://www.raywenderlich.com/314-image-depth-maps-tutorial-for-ios-getting-started), поэтому файлы jpg должны быть в порядке.

У кого-нибудь есть рабочий пример проекта? Спасибо

Ответы [ 2 ]

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

Вы можете загрузить подложку с эффектами портрета, сохраненную на фотографии, только в том случае, если на этой фотографии сохранена подложка с эффектами портрета.Это звучит как тавтология , поэтому позвольте мне расширить его:

  • Если вы сделали снимок самостоятельно, используя AVCapturePhotoOutput, вы получите матовые эффекты портрета, если и толькоif:

    • Это доступно / поддерживается на текущем устройстве захвата и конфигурации. Эффекты портрета требуют захвата глубины, поэтому вам необходимо выбрать заднюю двойную камеру илипередняя камера TrueDepth (на устройстве, оборудованном таким образом) и включенная глубина доставки .

    • Вы запрашиваете ее. Установите isPortraitEffectsMatteDeliveryEnabled в настройках фотографии перед съемкой.

    • Устройство может генерировать единицу. Штампы портретных эффектов получены из модели машинного обучения, обученной распознавать человеческие особенности.Если на вашей фотографии нет идентифицируемого человека, вы не получите мат.(Извините, любители домашних животных.)

    • Вы не можете сохранить его. Вы можете отключить embedsPortraitEffectsMatteInPhoto или использовать AVCapturePhotoFileDataRepresentationCustomizer для замены/ удалить подложку фотографии (или другие элементы) после съемки и перед сохранением.Очевидно, что если вы хотите матовый материал, не избавляйтесь от него.

  • То же самое касается изображений, сохраненных любым сторонним приложением, использующим камеру.захват API(То есть вы можете читать матовые изображения из изображений, сохраненных другими приложениями, если они выполнили вышеуказанные шаги, точно так же, как если бы вы пытались захватить изображение с помощью матового стекла.) См. Настройка захвата камеры для сбораЭффекты портрета Матовый .

  • Если вы сделали снимок с помощью встроенного в Apple приложения Camera, это должна быть фотография в портретном режиме (задняя двойная камера или фронтальная камера TrueDepth)на iOS 12.

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

Похоже, что этот API работает для фотографий с передней камеры, но пока не работает для фотографий с задней камеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...