четверг, 5 февраля 2009 г.

Отсеивание повреждённых фотографий

Данный пост является продолжением поста "Восстановление и каталогизация фотографий"

Казалось бы восстановление утраченных фотографий окончено, но при беглом осмотре обнаружились повреждённые фотографии, которые бы неплохо отсеить. Фотографий много, поэтому вручную каждую просматривать не вариант. В поиках вариантов обратил внимание на модуль для работы с изображениями PIL. Путём экспериметов обнаружилась закономерность: на всех проверенных повреждённых фотографиях функция histogram выбрасывала исключение. Эта особенность и была положена в основу приведённого ниже скрипта. Он (скрипт) принимает два аргумента: исходную директорию и результирующую директорию. Скрипт проходит исходную директорию, включая поддиректории, и переносит повреждённые изображения в результирующую директорию. Так же переносимые файлы переименовываются по следующиему шаблону: [имя_директории]_[имя_фала]. В ситуации с вложенностью, описанной в предыдущей статье, это обеспечивает несовпадение имён.

Вот собственно текст скрипта:
#!/usr/bin/env python
import os
import sys
import Image
import shutil

def check_file(file, output_dir):
    print 'Processing file ' + file + ': ',
    im = Image.open(file)
    try:
        im.histogram()
        print 'Fine'
    except IOError:
        print 'Broken. Moving...'
        dir, file_name = os.path.split(file)
        file_name = os.path.split(dir)[1] + '_' + file_name
        shutil.move(file, os.path.join(output_dir, file_name))
    except KeyboardInterrupt:
        print 'Exiting...'
        sys.exit(1)
    except:
        print 'Unexpexted exception'

for root, dirs, files in os.walk(sys.argv[1]):
    [check_file(os.path.join(root, f), sys.argv[2]) for f in files if f.endswith('.jpg')]

Комментариев нет:

Отправить комментарий