Как уменьшить и оптимизировать изображения?

Я сейчас пользуюсь jpegoptim в CentOS 6. Позволяет установить эталон качества и размера файла. Тем не менее, он не позволяет изменять размер изображений.

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

Например, я хотел бы получить все изображения с максимальной шириной 500 пикселей и 50 КБ.

Как я могу уменьшить и оптимизировать все эти изображения?

1 ответ

Вы можете сделать это с помощью ImageMagick, но сложно сказать, какой именно способ сделать это, поскольку это зависит от того, находятся ли все файлы в одном каталоге, а также от того, используете ли вы GNU Parallel или можете ли вы его использовать.

Как правило, вы можете уменьшить размер одного изображения до определенной ширины в 500 следующим образом:

# Resize image to 500 pixels wide
convert input.jpg -resize 500x result.jpg

где input.jpg а также result.jpg разрешено быть тем же файлом Если бы вы хотели сделать высоту, вы бы использовали:

# Resize image to 500 pixels high
convert input.jpg -resize x500 result.jpg

поскольку размеры указаны как width x height,

Если вы хотите уменьшить только файлы размером более 500 пикселей и не повышать их (увеличивать разрешение), добавьте > к измерению:

# Resize images wider than 500 pixels down to 500 pixels wide
convert image.jpg -resize '500x>' image.jpg

Если вы хотите уменьшить размер файла результата, вы должны использовать -define руководить кодировщиком JPEG следующим образом:

# Resize image to no more than 500px wide and keep output file size below 50kB
convert image.jpg -resize '500x>' -define jpeg:extent=50KB result.jpg

Итак, теперь вам нужно создать цикл вокруг всех ваших файлов:

#!/bin/bash
shopt -s nullglob
shopt -s nocaseglob

for f in *.jpg; do
    convert "$f" -resize '500x>' -define jpeg:extent=50KB "$f"
done

Если вам нравится перегружать все ядра вашего процессора, сделайте это с помощью GNU Parallel, чтобы выполнить работу быстрее.

Обратите внимание, что если у вас есть файл размером менее 500 пикселей в ширину, ImageMagick не будет обрабатывать его, поэтому, если он меньше 500 пикселей в ширину и также больше 50 КБ, он не будет уменьшен с точки зрения размера файла. Чтобы поймать этот маловероятный крайний случай, вам может понадобиться запустить другой find впоследствии, чтобы найти файлы размером более 50 КБ, а затем запустить их через convert но без -resize, что-то вроде этого:

find . -type f -iname "*.jpg" -size -51200c -exec convert {} -define jpeg:extent=50KB {} \;
Другие вопросы по тегам