Как проверить целостность файла изображения в C ++ или Python? - PullRequest
1 голос
/ 06 октября 2011

Я хочу проверить, загружены ли изображения полностью. Есть ли библиотека для использования? Изображения, которые я хочу проверить, включая различные форматы, такие как JPEG, PNG, BMP и т. Д.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Стандартной библиотекой для подобных вещей в Python является Python Imaging Library (PIL) .

0 голосов
/ 25 ноября 2018

Я использовал модуль Pyhton Pillow (PIL) и оберточную палочку Imagemagick (для форматов psd, xcf), чтобы обнаружить поврежденные изображения, исходный ответ с фрагментами кода здесь .

Я также реализовал это решение в своем скрипте Python здесь, на GitHub .

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

Я цитирую полный ответ для полноты:

Вы можете использовать Python Подушка *Модуль 1014 * (PIL), с большинством форматов изображений, для проверки того, является ли файл действительным и неповрежденным файлом изображения.

В случае, если вы хотите обнаружить также поврежденные изображения, @Nadia Alramli правильно предложит im.verify() метод, но этот не обнаруживает все возможные дефекты изображения , например, im.verify не обнаруживает усеченные изображения (которые большинство зрителей часто загружают с серой областью).

Подушка также может обнаруживать дефекты этого типа, но вы должны применить манипуляцию с изображением или декодировать / перекодировать изображение, чтобы запустить проверку.Наконец, я предлагаю использовать этот код:

try:
  im = Image.load(filename)
  im.verify() #I perform also verify, don't know if he sees other types o defects
  im.close() #reload is necessary in my case
  im = Image.load(filename) 
  im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
  im.close()
except: 
  #manage excetions here

В случае дефектов изображения этот код вызовет исключение.Пожалуйста, учтите, что im.verify примерно в 100 раз быстрее, чем выполнение манипуляций с изображениями (и я думаю, что flip - это одно из самых дешевых преобразований).С помощью этого кода вы будете проверять набор изображений со скоростью около 10 МБ / с (современный процессор с частотой 2,5 ГГц x86_64).

Для других форматов psd , xcf , .. вы можете использовать Imagemagick обертку Wand , код выглядит следующим образом:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

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

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

Я предлагаю всегда выполнять предварительную проверку, проверьте размер файла , чтобы он не был нулевым (или очень маленьким), это очень дешево идея:

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case
0 голосов
/ 06 октября 2011

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

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

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