Поврежденный джипег узнать нетрудно – при загрузке в веб выскочит ошибка и файл не откроется. Но когда дело доходит до тысяч и сотен тысяч файлов, проверить каждый ручками физически невозможно. Нужна автоматизация.
Перед любыми манипуляциями с большими галереями нужно позаботиться о создании бэкапа. Всякое бывает, лучше «пере», чем «недо». Резервных версий можно делать несколько, например, одну на жестком диске, а вторую — в облаке.
Найти
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 — дорого и сердито, зато качественно. Можно скачать демо-версию и попробовать на деле.
Конспект:
- Поиск поврежденных фоток в больших галереях следует автоматизировать.
- Перед любыми манипуляциями с большим количеством изображений нужно создать бэкап.
- Искать поврежденные фотки можно с помощью imagecreatefromjpeg или jpeginfo.
- Починить изображение поможет ImageMagick или платные программы.
ссылка на оригинал статьи http://habrahabr.ru/post/259001/
Добавить комментарий