Как проверить, действителен ли NSData для использования в UIImage
NSError *error = nil;
NSURL *url = [NSURL URLWithString:[imageLinks objectAtIndex:0]];
NSData *tdata = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];
if (error) {
NSLog(@"%@", [error localizedDescription]);
}else {
// no error, this one is being called within my app
NSLog(@"Data loaded successfully");
}
self.pictureView1.image = [UIImage imageWithData:tdata];
У меня есть файл jpeg, я могу подтвердить, что содержимое URL-адреса собрано успешно, но когда я пытаюсь поместить мои данные изображения в UIImage
, мое приложение терпит неудачу. Интересно, есть ли какая-либо проверка NSData, чтобы подтвердить ее использование для UIImage
.
Я также не знаю, что вызывает этот сбой, и как его предотвратить. Любая помощь будет оценена.
Ответы
Ответ 1
Как указано в документации imageWithData: возвращает nil, если UIImage не смог создать изображение из данных. Правильный способ справиться с этим во время выполнения - предоставить образ заполнителя, когда этот метод возвращает nil.
Что касается диагностики, сначала посмотрите на консольные сообщения, они иногда предоставляют полезную информацию. Если нет, лучше всего сбросить NSData на диск и сравнить результат с файлом, хранящимся на сервере. Иногда вы получаете поврежденные данные, иногда вы получаете сообщение об ошибке html, в котором вы ожидаете двоичные данные jpeg.
Ответ 2
Вы можете использовать
if ([UIImage imageWithData:yourNSData]) {
// there was an image
}
Ответ 3
Для Swift попробуйте это,
if let image = UIImage(data: yourNSData){
YourImageView.image = image
}
Ответ 4
if (tdata !=(NSData *)nil){
NSlog(@"Valid");
}
Ответ 5
Попробуй попробовать...
if ((dataImage != NULL) && ![v isKindOfClass:[NSNull class]])
{
}
В моем случае ничего не работало.
Ответ 6
Если вы имеете дело с одним маленьким изображением, вы можете преобразовать Data
в UIImage
:
if let _ = UIImage(data: data) {
print("data contains image data")
} else {
print("data does not contain image data")
}
Но если вы имеете дело с многочисленными изображениями или изображениями высокой четкости, вы можете использовать то, что называется The magic bytes
во всех файлах, то есть первые несколько байтов, представляющих подпись файла.
В основном вам просто нужно извлечь несколько байтов вместо выделения целого изображения.
Вот расширение Data
, используя этот метод:
import Foundation
extension Data {
var isImageData: Bool {
let array = self.withUnsafeBytes {
[UInt8](UnsafeBufferPointer(start: $0, count: 10))
}
let intervals: [[UInt8]] = [
[0x42, 0x4D], // bmp
[0xFF, 0xD8, 0xFF], // jpg
[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], // png
[0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20], // jpeg2000
[0x49, 0x49, 0x2A, 0x00], // tiff1
[0x4D, 0x4D, 0x00, 0x2A] // tiff2
]
for interval in intervals {
var image = true
for i in 0..<interval.count {
if array[i] != interval[i] {
image = false
break
}
}
if image { return true }
}
return false
}
}
Вы можете добавить больше изображений или представить любое распознавание типа файла на основе этого кода и типов файлов (см. список подписи файлов Википедии, например).
Ответ 7
if (tdata !=nil){
NSlog(@"Valid");
}
попробуйте это, это проверит, является ли nsdata пустым или нет.