Как уменьшить и оптимизировать изображения?
Я сейчас пользуюсь 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 {} \;