Intereting Posts
В чем разница между этими двумя командами dd? EBtables не работает Nagios: Как определить порядок параметров check_ssh Существует ли инструмент командной строки для управления написанными мной пакетами? Получение новой версии GEOS, чем то, что доступно в репозиториях Debian Напишите имя файла перед шаблоном внутри этого файла Загрузите сайт HTTPS только через имя пользователя и пароль с помощью wget? Объясните пользователю Linux, как работают драйверы BSD / OSX Ограничение, которое может отправить на адрес электронной почты Настройка Bash – Как оставить пробелы перед выводом команды? Кросс-ассемблер CPU Z80 для стандарта MSX Правильно удалите сокеты, случайно созданные с помощью tmux Распространение дистрибутива Linux на CF-карту Что произойдет, если я запустил fsck в / dev / sda вместо / dev / sda1? Сохранять метаданные или редактировать метаданные с помощью tar

Как перемасштабировать несколько изображений одного размера

У меня есть несколько файлов изображений в каталоге. Эти изображения имеют одинаковый размер и имеют одинаковый цвет фона.

Как сделать все изображения одинакового размера, добавив фон, подобный этому прикрепленному изображению?

введите описание изображения здесь

Это должно работать со всеми типами изображений, которые может обрабатывать ImageMagick, без указания *.png , *.jpg , *.jpeg т. Д .:

 #!/bin/bash images=$(identify -format '%f\n' * 2>/dev/null) IFS=$'\n' set -e max_dims=$( identify -format '%w %h\n' $images 2>/dev/null | awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}' ) orig_dir=originals_$(date +%Y-%m-%d_%T) mkdir "$orig_dir" mv -- $images "$orig_dir" cd "$orig_dir" set +e for image in $images; do convert -- "$image" -gravity Center -extent "$max_dims" "../$image" done 

Это приведет к перемещению исходных изображений в датированный каталог, если результаты нежелательны. Кроме того, это не удастся, если по какой-либо причине файлы изображений имеют новые строки в своих именах.

Этот скрипт мог бы сделать с некоторыми сообщениями об ошибках, чтобы дать полезное указание, если что-то пошло не так. Но пока, если есть какая-либо ошибка, перемещающая изображения (все между set -e и set +e ), скрипт выйдет. Надеюсь, это позволит избежать любого необратимого ущерба.

Обновить

Теперь с awk скриптом, бесстыдно плагиатом из ответа @ terdon .

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

 mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png 

Приведенная выше команда изменит исходный файл , вы можете захотеть выполнить резервное копирование перед его запуском. Он использует mogrify из ImageMagick для изменения размера всех png в текущем каталоге до 200x200px ( -extent 200x200 ), добавляя белый фон ( -background black ) и центрируя изображение ( -gravity Center ). -colorspace RGB необходимо для предотвращения ошибок, таких как

 mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754. 

Чтобы убедиться, что вы не потеряли данные изображения, убедитесь, что размер, который вы используете, больше или больше, чем самое большое изображение. Чтобы быстро это сделать, попробуйте:

 file *png | awk -F, '{print $2}' | sort -nu 

Это должно печатать размеры всех отсортированных изображений, и вы можете легко найти самый большой.


Чтобы успокоить goldilocks (: P), вы можете автоматизировать весь процесс:

 dimensions=$(file *png | cut -d, -f 2 | sort -u | awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') && mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png; 

Я воспользовался возможностью, чтобы улучшить свои навыки bash и придумал это:

 #!/bin/bash maxx=0 maxy=0 # find largest dimension for file in *.jpg ; do dim=$(identify "$file" | awk '{ print $3 }') xdim=$(echo $dim | cut -f1 -dx) ydim=$(echo $dim | cut -f2 -dx) if [ $xdim -gt $maxx ] ; then maxx=$xdim fi if [ $ydim -gt $maxy ] ; then maxy=$ydim fi done mkdir bordered # resize and store new images in new folder for file in *.jpg ; do dim=$(identify "$file" | awk '{ print $3 }') xdim=$(echo $dim | cut -f1 -dx) ydim=$(echo $dim | cut -f2 -dx) xborder=$(( ($maxx - $xdim ) / 2 )) yborder=$(( ($maxy - $ydim ) / 2 )) convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file" done 

Это должно сделать трюк: сначала он перебирает все файлы (изменяя в соответствии с вашими потребностями), чтобы найти наибольшую ширину и высоту, а затем снова петли, чтобы добавить необходимые границы (измените -bordercolor black часть -bordercolor black в соответствии с вашими потребностями). Новые файлы хранятся в папке «bordered».