Как определить, повреждена ли фотография? - PullRequest
3 голосов
/ 28 февраля 2011

У меня есть требование, при котором я должен определить, не повреждена ли фотография, и, соответственно, пометить ее как таковую.

Еще одна вещь, которая мне нужна, - определить, имеет ли изображение неправильное расширение.Под неправильным расширением я подразумеваю, что иногда я сталкиваюсь с фотографией с расширением jpg, но когда я загружаю эту фотографию в IrfanView, она сообщает, что фотография имеет другой формат, чем расширение.

Как я могусделайте это в Delphi.

Ответы [ 3 ]

14 голосов
/ 28 февраля 2011

У меня есть требование, когда я должен определить, не повреждена ли фотография, и, соответственно, отметить ее как таковую.

Вы можете попробовать некоторые вещи, но с определенными форматами файлов (пример: BMP, JPEG в некоторой степени) только человек может в конечном итоге решить, в порядке ли файл или поврежден.Самый простой тест - просто загрузить файл в соответствующий объект (TJpegImage, TPngObject и т. Д.).Если во время загрузки вы получили исключение, вы наверняка получили поврежденный файл.К сожалению, если не возникает исключение, вы не можете сказать, что файл не поврежден.Я видел поврежденные файлы JPEG, которые прекрасно загружаются в Delphi TImage и могут быть открыты с помощью средства просмотра изображений Windows, но явно повреждены для наблюдателя.С изображениями BMP это еще яснее: открыть растровое изображение, перезаписать несколько байтов в середине файла, а затем открыть его в средстве просмотра.Как любая автоматизированная система может сказать, что эти неправильно окрашенные биты в середине растрового изображения на самом деле неверны?

Еще одна вещь, которая мне нужна, это определить, имеет ли изображение неправильное расширение.Под неправильным расширением я подразумеваю, что иногда я сталкиваюсь с фотографией с расширением jpg, но когда я загружаю эту фотографию в IrfanView, она сообщает, что фотография имеет формат, отличный от расширения.

Как насчет того, чтобы сделать то же самое, пытаясь загрузить файл в объект, соответствующий его расширению, и, если у вас не получится, попробуйте открыть другие форматы?Это должно быть легко.

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

4 голосов
/ 28 февраля 2011

Поскольку вы использовали термин «требование», я подозреваю, что вы выполняете работу для кого-то, возможно, в качестве контракта. Поэтому убедитесь, что вы соблюдаете требования, прежде чем беспокоиться о коде.

ИМО, вам нужно получить образцы тестовых случаев. Как уже упоминалось, неудача при загрузке файла в определенном формате будет одним тестом. Но как насчет .jpg, который загружается нормально, но нижняя треть отсутствует? Или .jpg, который загружается нормально, но с зелеными «статичными» линиями посередине, где где-то произошла ошибка (на камере, фотошопе и т. Д.), Но затем обработка восстановилась и возобновилась? В этом случае .jpg действительно может иметь зеленые линии. Это считается "коррумпированным" или нет? Здесь нужно быть осторожным, особенно если это контрактная работа.

3 голосов
/ 28 февраля 2011

Единственный способ проверить, не поврежден ли файл, это попробовать прочитать его, как описано в формате файла, т.е. загрузить BMP как BMP с чтением заголовка BMP, данных BMP и т. д. Существует множество веб-страниц, описывающих форматы графических файлов. Конечно, если вы передаете файлы и боитесь, что они будут повреждены после передачи, сохраните такие файлы с некоторой суммой, например, CRC32 или даже криптографическим MD5 или SHA1. Затем после передачи проверьте, совпадает ли рассчитанная сумма с оригинальной.

В Delphi есть единица jpeg и типы TJPEGImage и TBitmap. Попробуйте загрузить его с данными и проверьте исключение. Для других форматов существует множество библиотек, просто найдите нужные форматы файлов.

Чтобы проверить, подходит ли расширение файла, попробуйте прочитать первые байты файла и проверить его с помощью словаря заголовков графических файлов. Например, GIF-файлы должны начинаться с GIF, BMP-файлы начинаются с BM, а в заголовке JPEG вы найдете JFIF. Я думаю, что утилита Unix file работает таким образом.

...