Подтвердить что ты не робот

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 перед преобразованием в изображение?

4b9b3361

Ответ 1

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

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

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

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)

Ответ 2

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

[UIImage imageWithContentsOfFile:topPathToFile]; 

ИЛИ

[UIImage imageWithData:data];

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Примечание. Данные - это класс 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...
     }
}