NSData для UIImage

Я пытаюсь сохранить UIIMage, а затем восстановить его и отобразить. Мне удалось сохранить изображение в комплекте, получить его оттуда и отобразить. Моя проблема возникает, когда я пытаюсь сохранить изображение на диск (конвертируя его в NSData), а затем извлекаю его. Я конвертирую изображение в NSData так …

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0); 

то я пишу его на диск так …

 [topImageData writeToFile:topPathToFile atomically:NO]; 

то я попытался восстановить его так …

 topSubView.image = [[UIImage alloc] initWithContentsOfFile:topPathToFile]; 

который не возвращает изображение (размер равен нулю). поэтому я попробовал …

 NSData *data = [[NSData alloc] initWithContentsOfFile:topPathToFile]; topSubView.image = [[UIImage alloc] initWithData:data]; 

но безрезультатно. Когда я перехожу к отладчику, я вижу, что данные содержат правильное количество байтов, но я смущен тем, почему мой образ не создается. Я пропустил шаг? Нужно ли что-то делать с NSData перед преобразованием в изображение?

Попробуйте этот код. Это сработало для меня.

Сохранение данных.

создайте путь для сохранения изображения.

 let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0] let libraryURL = URL(fileURLWithPath: libraryDirectory, isDirectory: true) let fileURL = libraryURL.appendingPathComponent("image.data") 

конвертировать изображение в объект Data и сохранять его в файл.

 let data = UIImageJPEGRepresentation(myImage, 1.0) try? data?.write(to: fileURL) 

получение сохраненного изображения

 let newImage = UIImage(contentsOfFile: fileURL.relativePath) 

Создайте изображение и загрузите его с полученным изображением.

 let imageView = UIImageView(image: newImage) self.view.addSubview(imageView) 

Вы должны иметь возможность использовать classные методы UIImage

 [UIImage imageWithContentsOfFile:topPathToFile]; 

ИЛИ

 [UIImage imageWithData:data]; 

Разве это не сработало?

Надеюсь это поможет!

На всякий случай это помогает кому-то, из iOS6 у нас есть метод imageWithData: scale. Чтобы получить UIImage с правильной шкалой из объекта NSData, используйте этот метод, объявив масштаб, который вы используете для хранения исходного изображения. Например:

 CGFloat screenScale = [[UIScreen mainScreen] scale]; UIImage *image = [UIImage imageWithData:myimage scale:screenScale]; 

Здесь myimage – это объект NSData, в котором вы сохранили исходное изображение. В этом примере я использовал масштаб экрана. Если вы используете другую шкалу для исходного изображения, используйте это значение.

Проверьте это: http://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/ .

У него есть то, что я думаю, решение вашей проблемы. Вы не можете просто сделать изображение из NSData, даже если это то, что предлагает здравый смысл. Вы должны использовать представление UIImagePNGR. Позвольте мне знать, если это помогает.

Используйте if-let block with Data для предотвращения краха приложения и безопасного выполнения кода, поскольку функция UIImagePNGRпредставляет новое значение.

 if let img = UIImage(named: "TestImage.png") { if let data:Data = UIImagePNGRepresentation(img) { // Handle operations with data here... } } 

Примечание. Данные – это class Swift 3+. Используйте данные вместо NSData с Swift 3+

Общие операции с изображениями (например, png и jpg):

 if let img = UIImage(named: "TestImage.png") { //UIImage(named: "TestImage.jpg") if let data:Data = UIImagePNGRepresentation(img) { handleOperationWithData(data: data) } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) { handleOperationWithData(data: data) } } ******* func handleOperationWithData(data: Data) { // Handle operations with data here... if let image = UIImage(data: data) { // Use image... } } 

Используя расширение:

 extension UIImage { var pngRepresentationData: Data? { return UIImagePNGRepresentation(img) } var jpegRepresentationData: Data? { return UIImageJPEGRepresentation(self, 1.0) } } ******* if let img = UIImage(named: "TestImage.png") { //UIImage(named: "TestImage.jpg") if let data = img.pngRepresentationData { handleOperationWithData(data: data) } else if let data = img.jpegRepresentationData { handleOperationWithData(data: data) } } ******* func handleOperationWithData(data: Data) { // Handle operations with data here... if let image = UIImage(data: data) { // Use image... } } 
  • Создание UIImage из повернутого UIImageView
  • Установка свойства изображения UIImageView вызывает серьезное отставание
  • Как создать изображение из UILabel?
  • Как сравнить один образ с другим, чтобы увидеть, похожи ли они на определенный процент, на iPhone?
  • Наложение UIImage с цветом?
  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Как узнать размер изображения после применения аспектного соответствия для изображения в UIImageView
  • Как захватить UIView в UIImage без потери качества на дисплее сетчатки
  • Изменение размера UI-изображений, снятых с камеры, также приводит к вращению UI-образа?
  • didFinishPickingMediaWithInfo return nil фото
  • Как перевернуть UIImage горизонтально?
  • Давайте будем гением компьютера.