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