Как проверить целостность изображения?
Я создаю веб-сканер, и одной из его функций является загрузка изображений.
Проблема в том, что иногда, по какой-то причине, есть изображения, которые загружаются с ошибками, например: половина изображения - просто серая или белая, как будто она перестала загружаться в какой-то момент, а затем заполнила пустоту серым. Типы изображений по-прежнему считаются действительными, потому что я могу получить их с помощью getimagesize, а также открыть и просмотреть их. Но они не похожи на оригиналы.
Есть идеи?
3 ответа
Сравнить заголовок ответа Content-Length
с фактическим количеством байтов, которые вы получили. Могут быть и другие причины, но я ничего не могу сказать, не увидев ваш код, где вы загружаете это изображение.
Просто выполните imagecreatefromstring() и проверяет, возвращает ли не ресурс
Я думаю, что это прерывание передачи.
Я вижу много случаев: либо ваше соединение было сброшено, в этом случае тестирование сигнала сокета должно позволить вам диагностировать проблему и повторно начать загрузку.
Либо во время передачи возникает необнаруженная ошибка (но обычно TCP/IP должен с этим справляться) и / или вы записываете все загруженные файлы некорректно (вам кажется, что вы прочитали все данные на сокете, но чтение дает наименьшее значение и Вы не проверяете возвращаемое значение, чтобы проверить его предполагаемый размер), и тогда ваше изображение не является полным.
Обычно полусерые изображения (особенно JPEG) являются признаком неполного файла (заголовки в порядке, поэтому у вас нет проблем с размером изображения), но JPEG не заканчивается 0xFF 0xD9
, Поэтому убедитесь, что вы прочитали все данные, сравнивая с размером, который вы должны прочитать. В конце концов вы можете написать зависимую от формата изображения функцию для проверки целостности файла, например, путем проверки флагов в JPEG. Но это может быть ресурсоемким.