Как найти и починить поврежденный JPEG

от автора

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



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

Найти

Imagecreatefromjpeg

Imagecreatefromjpeg cоздает новое изображение из 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 или платные программы.

ссылка на оригинал статьи http://habrahabr.ru/post/259001/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *