Как проверить, действителен ли 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 пустым или нет.