Вопрос по ios, objective-c, uiimageview, iphone, uiimage – Как проверить, является ли NSData действительным для использования в UIImage

15
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.

Я также не знаю, что вызывает этот сбой и как его предотвратить. Любая помощь будет оценена.

данные изображения повреждены, как их можно проверить, если их можно использовать в качестве изображения, и почему их нельзя использовать, если это так? Bartu
Вы можете проверить, является ли возвращаемое значение из статического конструктора UIImagenil или не посмотреть, действительно ли данные могут быть использованы в качестве изображения. Относительно того, почему это не удается, слишком мало информации, чтобы даже угадать причину. Можете ли вы опубликовать журнал для распечатки полученных NSData? nhahtdh
Я думаю, что я ответил на 2 ваших вопроса в моем комментарии. nhahtdh

Ваш Ответ

8   ответов
0
if (tdata !=(NSData *)nil){ 
    NSlog(@"Valid");
}
0

В Swift 4.2

self.userImageView.image = UIImage(data: data) != nil ? UIImage(data: data) : UIImage.init(named: "YourDesiredImage")
-1
if (tdata !=nil){ 
    NSlog(@"Valid");
}

попробуйте это, это проверит, пуста ли nsdata или нет.

да, но это был не вопрос.
2

ЗаSwift попробуй это,

if let image = UIImage(data: yourNSData){
   YourImageView.image = image
}
25

Как указанов документации imageWithData: возвращает ноль, если UIImage не может создать изображение из данных. Правильный способ справиться с этим во время выполнения - предоставить изображение-заполнитель, когда этот метод возвращает nil.

Что касается диагностики, сначала посмотрите на сообщения консоли, они иногда предоставляют полезную информацию. Если нет, вам лучше всего скопировать NSData на диск и сравнить результат с файлом, хранящимся на сервере. Иногда вы получаете поврежденные данные, иногда вы просто получаете сообщение об ошибке html, где вы ожидали двоичные данные jpeg.

0

Если вы имеете дело с одним небольшим изображением, вы можете преобразоватьData дляUIImage :

if let _ = UIImage(data: data) {
   print("data contains image data")
} else {
   print("data does not contain image data")
}

Но если вы имеете дело с многочисленными изображениями или изображениями высокой четкости, вы можете использовать то, что называетсяThe magic bytes во всех файлах, то есть в первых нескольких байтах, представляющих подпись файла.

По сути, вам просто нужно извлечь несколько байтов вместо выделения целого изображения.

ВотData расширение с использованием этой техники:

Фонд импорта

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
    }
}

Вы можете добавить больше изображений или представить любое распознавание типов файлов на основе этого кода и типов файлов (см. список файловых подписей в Википедии например).

0

Дайте это попробовать ...

if ((dataImage != NULL) && ![v isKindOfClass:[NSNull class]])
{

}

Ничто не сработало в моем случае, кроме этого.

4

Ты можешь использовать

 if ([UIImage imageWithData:yourNSData]) {
     // there was an image
 }

Похожие вопросы