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

Я создаю веб-сканер, и одной из его функций является загрузка изображений.

Проблема в том, что иногда, по какой-то причине, есть изображения, которые загружаются с ошибками, например: половина изображения - просто серая или белая, как будто она перестала загружаться в какой-то момент, а затем заполнила пустоту серым. Типы изображений по-прежнему считаются действительными, потому что я могу получить их с помощью getimagesize, а также открыть и просмотреть их. Но они не похожи на оригиналы.

Есть идеи?

3 ответа

Решение

Сравнить заголовок ответа Content-Length с фактическим количеством байтов, которые вы получили. Могут быть и другие причины, но я ничего не могу сказать, не увидев ваш код, где вы загружаете это изображение.

Просто выполните imagecreatefromstring() и проверяет, возвращает ли не ресурс

Я думаю, что это прерывание передачи.

Я вижу много случаев: либо ваше соединение было сброшено, в этом случае тестирование сигнала сокета должно позволить вам диагностировать проблему и повторно начать загрузку.

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

Обычно полусерые изображения (особенно JPEG) являются признаком неполного файла (заголовки в порядке, поэтому у вас нет проблем с размером изображения), но JPEG не заканчивается 0xFF 0xD9, Поэтому убедитесь, что вы прочитали все данные, сравнивая с размером, который вы должны прочитать. В конце концов вы можете написать зависимую от формата изображения функцию для проверки целостности файла, например, путем проверки флагов в JPEG. Но это может быть ресурсоемким.

Другие вопросы по тегам