2016-02-10 5 views
0

У меня есть изображения всех разных размеров и пропорций, которые я пытаюсь преобразовать в квадрат с размером изображения 400x400.ImageMagick - Squaring изображения разных размеров

Первый запущенный сценарий меняет любое изображение размером более 1000x1000 до этого размера, добавляя белый фон, центрируя и добавляя 20px padding.

mogrify -resize '1000x1000>' -background white -gravity center -bordercolor white -border 20 -format jpg -quality 80 -path converted -strip * 

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

Ex:

355x307 --> 400x400 
640x400 --> 640x640 
1040x515 --> 1040x1040 
494x713 --> 713x713 

Любая помощь приветствуется, спасибо

+0

Был аналогичный вопрос пару недель назад: http://stackoverflow.com/questions/31713634/how-to-square-an-image-and-pad-with-transparency-from-the-commandline -imagemagi/34992414 # 34992414 – Bonzo

ответ

0

Мне кажется, что вы просто хотите сделать квадрат, стороны которого являются самыми длинными из: w, h и 400. Если это правильно, вы можете сделать это в 2 if заявления, как это:

if(w>h && w>400) 
    w 
else if (h>400) 
    h 
else 
    400 

ImageMagick может сказать вам, что на одном дыхании, как это:

identify -format "%[fx:((w>h)&&(w>400))?w:((h>400)?h:400)]" image.jpg 

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

dim=$(identify -format "%[fx:((w>h)&&(w>400))?w:((h>400)?h:400)]" image.jpg) 
convert image.jpg -resize ${dim}x${dim) -border 20 result.jpg 

, то вы бы положить, что в цикле, как это:

mkdir squared 
for f in *.jpg; do 
    dim=$(identify -format "%[fx:((w>h)&&(w>400))?w:((h>400)?h:400)]" "$f") 
    convert "$f" -resize ${dim}x${dim) -border 20 squared/"$f" 
done 
+0

Хотел бы сделать небольшую модификацию, но это похоже на трюк, спасибо. – rjferg

0

Вот как вы можете получить ожидаемые размеры:

#!/bin/bash 
while read from to ; do 
    x=${from%x*} 
    y=${from#*x} 
    if ((x > y)) ; then 
     tmp=$x 
     x=$y 
     y=$tmp 
    fi      # We are now sure x < y 
    if ((y < 400)) ; then 
     to_x=400 
     to_y=400 
    else 
     to_x=$y 
     to_y=$y 
    fi 
    # Verify the result is correct: 
    [[ $to == $to_x'x'$to_y ]] || echo $from $to $to_x'x'$to_y 
done <<EOF 
355x307 400x400 
640x400 640x640 
1040x515 1040x1040 
494x713 713x713 
EOF 

Вы можете использовать identify, чтобы получить фактические размеры образ.

Смежные вопросы