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



Перед любыми манипуляциями с большими галереями нужно позаботиться о создании бэкапа. Всякое бывает, лучше «пере», чем «недо». Резервных версий можно делать несколько, например, одну на жестком диске, а вторую — в облаке.

Найти




Imagecreatefromjpeg

Imagecreatefromjpeg создает новое изображение из URL или из файла:

imagecreatefromjpeg(string $filename);

При наличии ошибок возвращает пустую строку.

Jpeginfo

Jpeginfo находит поврежденные джипеги в указанной директории и субдиректориях. Показывает ошибку или предупреждение:

find . -name "*jpg" -exec jpeginfo -c {} \; | grep -E "WARNING|ERROR"

Для получения списка поврежденных файлов:

find ./ -name *jpg -exec jpeginfo -c {} \; | grep -E "WARNING|ERROR" | cut -d " " -f 1


ImageMagick

Можно попробовать в ImageMagick через функцию identify проверять картинки на наличие инородных байтов:

$ identify broken.jpg
broken.jpg JPEG 3264x2448 3264x2448+0+0 8-bit DirectClass 1.018MB 0.000u 0:00.010
identify: Corrupt JPEG data: 29359 extraneous bytes before marker 0xda `broken.jpg' @ warning/jpeg.c/JPEGWarningHandler/346

Также полезной будет функция convert:

$ convert test.jpg out.jpg
convert: Corrupt JPEG data: 1072 extraneous bytes before marker 0xd8 `test.jpg' @ warning/jpeg.c/EmitMessage/231.

Но следует помнить, что IMagick проверяет только header, и при этом может провтыкать другие дефекты.

Bad Peggy

Программа сканирует картинки пачками. Работает просто — установить — указать путь папки — сканировать. Результаты можно посмотреть в виде превьюшек, а можно просто запросить список поврежденных файлов. Работает также с PNG, BMP и GIF.


Починить




ImageMagick

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

$ for i in *.jpg; do
 identify -regard-warnings "$i" > /dev/null;
 if [ $? -eq 1 ]; then
  mkdir fixed
  echo "Writing fixed/$i"
  jpegtran -perfect -copy all -outfile "fixed/$i" "$i"
 fi
done


Можно также опробовать Perl-скрипт:

#!/usr/bin/perl

processFile("$_") foreach (@ARGV);

#recursively fix images
sub processFile {
   my $file=shift;
   return (-d "$file")?( do{ processFile("$_") foreach (<"$file"/*>) }) : `convert "$file" "$file"`;
}

Восстановление побитых изображений — платное удовольствие. Одна из самых популярных программ в сети — Stellar Phoenix JPEG Repair. Заявляют, что за 39$ могут починить абсолютно нечитабельные файлы.
PixRecovery — дорого и сердито, зато качественно. Можно скачать демо-версию и попробовать на деле.

Конспект:


  1. Поиск поврежденных фоток в больших галереях следует автоматизировать.
  2. Перед любыми манипуляциями с большим количеством изображений нужно создать бэкап.
  3. Искать поврежденные фотки можно с помощью imagecreatefromjpeg или jpeginfo.
  4. Починить изображение поможет ImageMagick или платные программы.

Комментарии ()


  1. datacompboy
    28.05.2015 17:23
    +6

    А конкретные примеры «качества» восстановления и состояния оригиналов?
    Пока статья вышла «я прочитаю первые 5 ссылок поисковика для вас».