1 авг. 2008 г.

Масштабирование картинок

Есть задача масштабировать большой набор картинок к некоторому меньшему размеру.

В качестве инструментария можно использовать:В качестве примера используем следующую картинку:
Исходная картинка


Требуемые конечные размеры: 100x100.

Исторически сложилось, что первая реализация была сделана с использованием ImageMagick:
width=100
height=100

PIC_INFO=`identify -format "%m %w %h" $pic 2>/dev/null || echo "false"`
if [[ $PIC_INFO != "false" ]]; then
# image format
FORMAT=`echo $PIC_INFO | cut -d ' ' -f1`
# picture width
W=`echo $PIC_INFO | cut -d ' ' -f2`
# picture height
H=`echo $PIC_INFO | cut -d ' ' -f3`

# picture info
pi="$pic $FORMAT [$W x $H]"

## convert if only file is image and exciting [width x height]
if [[ $W -gt $width || $H -gt $height ]]; then
echo "convert $pi..."
convert $pic -resize "$size>" -sharpen 0.8 $pic
else
if [[ $FORMAT == "JPEG" ]]; then
echo "$pi : there is no reason to convert $pic"
else
echo "$pi is not a JPEG, convert to JPEG"
convert $pic $pic
fi
fi



Масштабированная картинка силами ImageMagick


Однако в приведённом уже скрипте содержится «финт ушами»: после пропорционального масштабирования картинки необходимо повысить резкость, но так, чтобы не полез т.н. «переsharp»


Рассмотрим этапы обработки картинки средствами Python Imaging Library:

img.thumbnail((target_width, target_height))
без использования фильтров, без повышения резкости


img.thumbnail((target_width, target_height), Image.ANTIALIAS)
с использованием фильтра ANTIALIAS, но без повышения резкости



img.thumbnail((target_width, target_height), Image.ANTIALIAS)
ImageEnhance.Sharpness(img).enhance(sharpnessFactor)

с использованием фильтра ANTIALIAS и повышением резкости,
sharpnessFactor = 2.6


Замечание 1: функция thumbnail(size), в отличии от resize(size), производит пропорциональное масштабирование с сохранением пропорций.

Замечание 2: Размеры картинок полученные ImageMagick'ом 3189байт, Python Imaging Library: 2278байт, хотя при этом немного отличается насыщенность картинки.

дополнено:

Замечание 3: Уровень повышения резкости
ImageEnhance.Sharpness(img).enhance(sharpnessFactor)
для разных картинок разный - когда изменения меньше, чем порядок можно сказать, что он имеет линейную зависимость и равен отношению размеров исходной картинки (sourceWidth) к итоговой (targetWidth).

sharpnessFactor = sourceWidth / targetWidth

1 комментарий:

Alexey Zavizionov комментирует...

Полезная информация.