2009-02-17 22 views
1

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

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

Есть ли простой способ проверить, действительно ли изображение? Меня беспокоят только jpg, gif и png.

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

ответ

5

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

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

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

+0

Я думаю, что это хороший ответ. Просто стыдно, что использование ожидаемых веб-методов может быть разрушено с ошибками на стороне сервера. Тем не менее, рекомендации во втором абзаце звучат. :) – jheriko

1

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

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

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

3

Спасибо за ответы ребята. У меня все готово скачало файл, поэтому я просто проверил магический номер, поскольку передняя часть, которую я использую (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; 
} 
0

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

+0

Проблема заключается в том, что веб-страница дает вам страницу ошибок 404 вместо iamge – Lodle

+0

Ответ 404, содержащий любой контент, должен указывать Content-Type, если он ожидает рендеринга. – Tom

Смежные вопросы