Использование UIImagePickerController для получения изображения – как узнать, сохранять ли PNG или JPEG?

У меня есть UIImagePickerController позволяющий пользователю выбрать изображение из библиотеки изображений, и я получаю его результаты с помощью метода didFinishPickingMediaWithInfo .

Мне нужно сохранить результирующее изображение на диск (в папке документов приложения) и перезагрузить его позже.

Проблема в том, что я не могу сказать, хранить ли его как PNG или JPEG. Я не могу просто сохранить его как PNG, потому что для больших фотографий он бесконечно медленный (не говоря уже о том, что мне приходится иметь дело с сохранением ориентации изображения отдельно). Я не могу просто хранить его как JPEG, потому что в некоторых случаях у изображений есть прозрачность, которые будут потеряны, если я это сделаю.

Я изучил ключ UIImagePickerControllerMediaType в информационном словаре, возвращаемом сборщиком изображений, и независимо от того, выбрал ли я PNG или JPEG, то, что возвращается, является "image.public" .

Так…

Есть ли способ узнать, выбрал ли пользователь PNG? Может быть, какой-то метод проверки наличия прозрачности или чего-то еще?

Благодарю.

в словаре ключ UIImagePickerControllerReferenceURL предоставит вам информацию о типе

(gdb) po info

 { UIImagePickerControllerMediaType = "public.image"; UIImagePickerControllerOriginalImage = "<UIImage: 0x5cfd00>"; UIImagePickerControllerReferenceURL = "assets-library://asset/asset.JPG?id=EFC44C3C-9C82-4669-924B-A2B9DE6F1F45&ext=JPG"; } 

В этом случае это jpg, как показано ext = JPG

Хорошо, поэтому я понял это. Это может не работать для каждого сценария, но для меня этого достаточно:

  CGImageAlphaInfo imgAlpha = CGImageGetAlphaInfo(theImage.CGImage); // Is this an image with transparency (ie do we need to save as PNG?) if ((imgAlpha == kCGImageAlphaNone) || (imgAlpha == kCGImageAlphaNoneSkipFirst) || (imgAlpha == kCGImageAlphaNoneSkipLast)) { // save as a JPEG } else { // save as a PNG } 

… конечно, вам нужно помнить, какой тип изображения вы сохранили, дать ему соответствующее расширение файла и загрузить верный обратно … но в основном это позаботится об этом. Изображения с прозрачностью будут сохраняться как PNG, все остальное как JPEG.

Если у кого-нибудь есть лучшие методы, я бы хотел их услышать. Благодаря!

  • UIPopoverController & UIImagePickerControl: «Попутчики не могут быть представлены с точки зрения, которая не имеет окна»
  • UIImagePickerController при увольнении получает redbar с именем приложения с помощью UITabbarcontroller
  • Использование UIImagePickerController в UIView
  • UIImagePickerController с allowEditing не позволяет панорамировать обрезку
  • Is _UIImagePickerControllerUserDidCaptureItem - это частный API UIImagePickerController?
  • Как установить местоположение для захваченной фотографии с помощью UIImagePickerController?
  • Выберите несколько изображений (UIImagePickerController или Photos.app Share UI)
  • Добавьте круговой компонент обрезки для UIImagePicker?
  • Черный экран появляется случайно после съемки изображения и нажатия «USE» в UIImagePickerController
  • Как добавить индикатор в UIImagePickerController
  • Как отобразить «Camera Roll» напрямую с помощью ImagePickerController
  • Interesting Posts

    Серый бар, появляющийся под навигационной панелью после segues Swift

    Горизонтальная прокрутка на iOS без вертикального отскока или сверхбыстрой инерции

    IOS Contacts, как кодировать и декодировать imageData в String и отправлять его через словарь infoDiscovery с рекламодателем MPC

    Первое нажатие на UITableView игнорируется после deleteRowsAtIndexPaths

    Использование @property и слабых свойств в Objective-C

    Как сохранить 2 разных шрифта в одном UITextField или UITextView?

    Потенциальная утечка объекта, выделенного в iphone

    Ошибка компоновщика Unity Xcode

    Открыть карты с определенным адресом iOS 7

    missing @end + ожидаемый идентификатор "{" ошибки в модуле XCode 4.2 .h

    Как я могу создать один UITableView с двумя источниками данных

    почему моя почтовая рассылка не работает с MFMailComposeViewController?

    Регистрация / конфигурирование устройства Apple iOS MDM

    Вызов и печать объекта внутри объекта в swift 2

    Не удается создать приложение после перехода на Fabric из Crashlytics

    Давайте будем гением компьютера.