NSData для UIImage - PullRequest
       41

NSData для UIImage

20 голосов
/ 11 февраля 2010

Я пытаюсь сохранить 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 перед преобразованием в изображение?

Ответы [ 5 ]

33 голосов
/ 19 апреля 2011

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

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

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

let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory,
                                                               .userDomainMask,
                                                               true)[0]
let libraryURL = URL(fileURLWithPath: libraryDirectory, isDirectory: true)
let fileURL = libraryURL.appendingPathComponent("image.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)
17 голосов
/ 11 февраля 2010

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

[UIImage imageWithContentsOfFile:topPathToFile]; 

OR

[UIImage imageWithData:data];

Это не сработало?

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

6 голосов
/ 08 февраля 2014

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

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

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

0 голосов
/ 27 октября 2017

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

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...
     }
}
0 голосов
/ 06 февраля 2011

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

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

...