Проверьте правильность изображения - PullRequest
1 голос
/ 17 февраля 2009

Я пишу программу, которая загружает информацию из Интернета, и частично это изображения.

В данный момент у меня проблема, поскольку код для загрузки изображений отличается от кода, который их отображает (в разделе mvc). Если выдается 404 или загрузка изображения происходит каким-либо образом, в коде дисплея появляется сообщение, которое я хотел бы избежать.

Есть ли простой способ проверить правильность изображения? Я беспокоюсь только о JPG, GIF и PNG.

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

Ответы [ 4 ]

6 голосов
/ 17 февраля 2009

Хотите проверить, будет ли загрузка успешной? Или вы хотите проверить, что загруженное на самом деле изображение?

В первом случае единственный способ проверить это - попытаться получить к нему доступ и посмотреть, какой код ответа HTTP вы получаете. Вы можете отправить HTTP HEAD запрос на получение кода ответа, фактически не загружая изображение, но если вы все равно собираетесь продолжить загрузку изображения (если оно успешно), то отправка отдельного HEAD запроса выглядит как пустая трата времени (и пропускная способность).

В качестве альтернативы, если вы действительно хотите проверить, является ли загружаемый файл действительным файлом образа, вам необходимо прочитать весь файл, чтобы проверить его на наличие повреждений. Но если вы просто хотите проверить правильность расширения файла, этого должно быть достаточно, чтобы проверить первые несколько байтов файла. Все изображения GIF начинаются с текста ASCII GIF87 или GIF89 в зависимости от того, какая спецификация GIF используется. Изображения PNG начинаются с текста ASCII PNG, а изображения JPEG имеют магическое число, которое, по-видимому, составляет 0xd8ffe0ff на основе JPEG, которые я просматривал. (Вы должны провести некоторое исследование и проверить это, попробуйте Википедию для ссылок) Имейте в виду, однако, что, чтобы получить даже первые несколько байтов изображения, вам нужно будет отправить HTTP-запрос, который может вернуть 404 (и в этом Если у вас нет изображения для проверки).

3 голосов
/ 17 февраля 2009

Спасибо за ответы, ребята. У меня есть все готовые загруженные файлы, поэтому я просто проверил магическое число в качестве внешнего интерфейса, который я использую (wxWidgets), у всех готовых есть библиотека изображений, и я хотел что-то очень легкое.

uint8 UTIL_isValidImage(const unsigned char h[5])
{

    //GIF8
    if (h[0] == 71 && h[1] == 73 && h[2] == 70 && h[3] == 56)
        return IMAGE_GIF;

    //89 PNG
    if (h[0] == 137 && h[1] == 80 && h[2] == 78 && h[3] == 71)
        return IMAGE_PNG;

    //FFD8
    if (h[0] == 255 && h[1] == 216)
        return IMAGE_JPG;

    return IMAGE_VOID;
}
1 голос
/ 17 февраля 2009

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

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

Если вы возвращаете файл и хотите посмотреть, возможно ли это изображение, не полностью расшифровав его, тогда вам нужно будет проверить правильность хотя бы заголовков. libpng и libjpeg предлагают довольно низкоуровневый доступ к файлам png и jpeg соответственно. Вы также можете взглянуть на библиотеки более высокого уровня, такие как ImageMagick , MFC от Microsoft или любую другую, наиболее подходящую для вашей платформы.

0 голосов
/ 17 февраля 2009

Когда вы GET ресурс через HTTP, вы должны использовать заголовок Content-Type, чтобы определить, как обрабатывать контент. Если вы уже загрузили его в локальный файл, информация, на которую опирается настоящий веб-браузер, уже потеряна. Во многих случаях URL будет соответствовать Content-Type (например, http://example.com/image.png обозначается как Content-Type: image/png). Однако на это нельзя полагаться.

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