Получение данных глубины от UIImagePickerController - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить данные о глубине, связанные с изображением в PhotoLibrary.Я могу получить изображение и URL , но я не могу получить дополнительные данные, связанные с ним.Вызов CGImageSourceCreateWithURL возвращает источник, но вызов CGImageSourceCopyAuxiliaryDataInfoAtIndex возвращает nil для kCGImageAuxiliaryDataTypeDisparity и kCGImageAuxiliaryDataTypeDepth.Я что-то упускаю здесь?

func imagePickerController(_ picker: UIImagePickerController,    didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage]
    let url = info[UIImagePickerControllerImageURL]
    print("url=",url)

    guard let source = CGImageSourceCreateWithURL(url as! CFURL, nil) else {
        return
    }
    guard let auxDataInfo = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypeDisparity) as? [AnyHashable : Any] else {
        return
    }
}

1 Ответ

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

URL-адрес изображения, предоставленный UIImagePickerController, не включает метаданные, связанные с глубиной. Чтобы получить эту информацию, вы должны получить доступ к PHAsset с помощью API PhotoBook.

Сначала импортируйте API:

import Photos

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

    switch PHPhotoLibrary.authorizationStatus() {
    case .notDetermined:
        PHPhotoLibrary.requestAuthorization { (status) in
            if status == .authorized {
                DispatchQueue.main.async {
                    // Display image picker here
                }
            }
        }
    case .authorized: // Display image picker here
    case .denied, .restricted: // Display appropriate error here
    }

Теперь, в вашем делегате выбора изображений вы можете сделать это:

    if let asset = info[.phAsset] as? PHAsset {
        PHImageManager.default().requestImageData(for: asset, options: nil) { (imageData, dataType, orientation, info) in
            let url = info?["PHImageFileURLKey"] as? URL
            // Pass this URL to your existing code.
        }
    }

Обратите внимание, что файл может содержать информацию о глубине или несоответствии. Вы можете легко конвертировать между ними, но вам может понадобиться проверить, какой из них вы используете CGImageSourceCopyProperties(). Также обратите внимание на новые дополнительные данные о глубине kCGImageAuxiliaryDataTypePortraitEffectsMatte, которые дают маску с гораздо более высоким разрешением только для объекта съемки на портретных изображениях и отлично подходят для создания эффектов в стиле зеленого экрана.

...