paulmann
@paulmann
Путешествую, увлекаюсь программированием

Какая программа есть под Linux для поиска битых картинок/изображений?

Какая программа под Linux ищет битые изображения?

При оптимизации картинок, столкнулся с тем, что на сайте много битых картинок, но как их удалить одним махом?

Запуск команды
find /var/www -name "*.gif" -print0 | xargs -0 ~/usr/bin/gifsicle-1.87/src/gifsicle -b -O3

выдает:
gifsicle:/var/www/photos/28060fr02.gif: read error: image corrupted, code out of range (4 times)
gifsicle:/var/www/photos/28060fr02.gif: read error: missing 8089 pixels of image data
gifsicle:/var/www/photos/97529fr02.gif: read error: image corrupted, code out of range (20 times)
gifsicle:/var/www/photos/97529fr02.gif: read error: (not reporting more errors)


Но gifsicle не умеет удалять плохие файлы.
  • Вопрос задан
  • 594 просмотра
Решения вопроса 1
paulmann
@paulmann Автор вопроса
Путешествую, увлекаюсь программированием
Нет, -I выдает одинаковый результат на битых и целых картинках:
Целая:

-bash-4.1# ~/usr/bin/gifsicle-1.87/src/gifsicle -I /var/www/paulmann/data/www/paulmann.su/photos/28060fr02.gif
* /var/www/paulmann/data/www/paulmann.su/photos/28060fr02.gif 1 image
logical screen 120x70
global color table [256]
background 0
+ image #0 120x70

Битая:

-bash-4.1# ~/usr/bin/gifsicle-1.87/src/gifsicle -I /var/www/paulmann/data/www/paulmann.su/photos/28060bad.gif
* /var/www/paulmann/data/www/paulmann.su/photos/28060bad.gif 1 image
logical screen 120x70
global color table [256]
background 0
+ image #0 120x70


и только запустив оптимизацию мы имеем:
gifsicle:/var/www/paulmann/data/www/paulmann.su/photos/28060bad.gif: read error: image corrupted, code out of range (4 times)
gifsicle:/var/www/paulmann/data/www/paulmann.su/photos/28060bad.gif: read error: missing 8089 pixels of image data


Спасибо Валерий Рябошапко - что-бы твое решение работало нужно вместо "-I" использовать "-O3", т.к. битый файл определяется только при компрессии. Удалил все, на что ругнулась программа при оптимизации (если оптимизация успешная, gifsicle ничего не выводит):

for i in `find /var/www -name "*.gif"`; do ~/usr/bin/gifsicle-1.87/src/gifsicle -O3 $i > /dev/null || rm $i done


P.S. при этом, кроме битых, удалятся JPG файлы с расширением GIF и все другие файлы с которыми хоть что-то не то.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
valerium
@valerium
Изобретая велосипед
Почти наверняка gifsicle, когда натыкается на плохую картинку, возвращает код выхода отличный от нуля. Используя эти сведения, можно легко наваять скрипт, который будет удалять битые картинки.

Что-то вроде такого, но нужно тестить перед исполнением на реальных данных.
for i in `find /var/www -name "*.gif"`; do
    ~/usr/bin/gifsicle-1.87/src/gifsicle -I $i > /dev/null || rm $i
done
Ответ написан
SagePtr
@SagePtr
Еда - это святое
Если картинки побились каким-то макаром - я бы не стал доверять уцелевшим картинкам с того же источника. Ведь картинки некоторые могли побиться и так, что они не будут отличаться от уцелевших или вообще быть перезаписаны другими картинками.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы