Как проверить, действительно ли изображение на iPhone - PullRequest
3 голосов
/ 30 декабря 2011

Как проверить правильность изображения

Например, когда я кэшировал изображение, которое было загружено только наполовину и потерпело неудачу, и это изображение является недействительным, я хочу знать, что это недопустимое изображение, и загрузить снова. (Когда я использую сломанное изображение, консоль XCode регистрирует ошибку: ImageIO: PNG IDAT: ошибка CRC )

Итак, я хочу найти механизм для проверки правильности изображения для различных видов JPEG, PNG и т. д.

у кого-нибудь есть подсказки?

Ответы [ 4 ]

5 голосов
/ 09 сентября 2012

Я бы начал с проверки правильности заголовка. Во-вторых, нижний колонтитул. Обычно последние 8 байтов значения uint в порядке '73, 69,78,68,174,66,96,130. Это преобразовано в Int64 равно 5279712195050102914

Это должно сделать для PNG:)

if (memcmp (img_bytes, "\ 211PNG", 4)! = 0 || OSReadBigInt64 (img_bytes, (длина - 8))! = 5279712195050102914)

{

  //Bad Data! Free your data and return or something

}

1 голос
/ 04 февраля 2013

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

0 голосов
/ 30 декабря 2011

Для загрузки изображений из сети есть два очевидных случая сбоя:

  1. Загруженный файл не был изображением вообще.
  2. Загруженные данные содержат только часть изображенияdata.

Для первого случая nil проверка возвращаемого значения различных методов UIImage, вероятно, является лучшим способом обработки этого случая ошибки.

Следующие методы класса на UIImage будутвернуть ноль, если изображение не может быть инициализировано с данными, которые были ему предоставлены: + (UIImage *)imageWithData:(NSData *)data и + (UIImage *)imageWithContentsOfFile:(NSString *)path.

Код, который выполняет проверку на ноль, может выглядеть следующим образом:

UIImage *image = [UIImage imageWithContentsOfFile:pathToImage];
if (image) {
    // The image was loaded. Display it
}
else {
    // The image was not loaded. Redownload or display a placeholder, etc...
}

Для второго случая сбоя это скорее всего результат потери соединения.В этом случае сбой лучше всего обрабатывать в делегате NSURLConnection.При загрузке изображения, если вызывается - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error, данные для запроса должны быть отброшены.

Также имейте в виду, что didFailWithError: не будет вызываться для ответов 4xx или 5xx от сервера.Он вызывается, когда соединение обрывается по другим причинам.Как правило, было бы неплохо убедиться, что вы записываете данные изображения на диск только тогда, когда сервер ответил 200 OK.

0 голосов
/ 30 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...