Команды Imagemagick для изменения размера, поворота, переноса и объединения изображений - PullRequest
1 голос
/ 29 октября 2019

В настоящее время я использую Photoshop для изменения размера, поворота в случайном порядке и произвольной упаковки изображений для создания этого типа монтажа ....

Комические обложки

IЯ подумал, что такие вещи должны быть выполнимыми в Imagemagick. Я знаю, как использовать все команды по отдельности, и я могу выполнять произвольные повороты и переносы, используя BASH, но мне не хватает одного изображения из отдельных изображений.

Предположим, что исходные изображения имеют разные размеры, нодолжен быть изменен до 250px в ширину. Изображения будут называться image1.jpg, image2.jpg и т. Д. Также предположим, что пункт назначения должен быть 1000x1000px. В зависимости от того, сколько фотографий у меня есть, все изображение размером 1000x1000 может не покрываться - я это понимаю. Я в основном использую BASH, но у меня есть несколько различных сред и оболочек, доступных для меня.

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Используя ImageMagick 6 или 7, если у вас достаточно памяти для одновременного считывания всех ваших изображений, вы можете изменить их размер, произвольно повернуть их и поместить все в случайных местах на холст 1000x1000 с помощью команды, подобной этой ...

convert granite: -duplicate 11 -resize 250x \
   -background none -gravity center -extent 1000x1000 \
   -distort SRT "%[fx:rand()*45-22.5]" -virtual-pixel tile \
   -distort affine "%[fx:w/2],%[fx:h/2] %[fx:rand()*w],%[fx:rand()*h]" \
   -flatten result.png

При этом используется встроенное изображение ImageMagick «granite:», дублированное еще 11 раз. Замените «granite: -duplicate 11» списком ваших входных файлов.

Он начинается с изменения их размера до ширины 250 пикселей, а затем размещения каждого из них в центре прозрачного холста 1000x1000.

Настоящая работа выполняется в операциях искажения. Первый «-истор СТО» поворачивает каждое изображение на произвольную величину от -22,5 до +22,5 градуса. Затем «-distort affine» перемещает каждое изображение в случайное место на холсте. Любая часть изображения, выходящая за пределы холста, будет откатываться на противоположную сторону. Это делает результат пригодным для мозаичного изображения.

Эта команда выравнивает все на прозрачном фоне, где бы оно ни отображалось между изображениями. Добавьте «-background blue» непосредственно перед операцией «-flatten», чтобы изменить цвет фона, например, на синий.

Это работает на моем IM 6 в bash. Для IM 6 в Windows измените обратную косую черту продолжения строки "\" на "^". Для IM версии 7 измените «конвертировать» на «магию».

1 голос
/ 30 октября 2019

Вот скрипт bash Imagemagick 6, который берет список изображений. Вы можете заменить его своими изображениями. Он использует обработку подоболочки, чтобы избежать необходимости записывать временные образы на диск. Сохраняет изображения в формате miff: как один файл из цикла. Затем он передает многостраничное слияние miff: file -layers, которое накладывает изображения на прозрачное базовое изображение 1000x1000. Для Imagemagick 7 замените конвертацию магией.

list="lena.jpg barn.jpg mandril3.jpg zelda1.jpg"
convert -size 1000x1000 xc:none result.png
(
for img in $list; do
angle=`convert xc: -format "%[fx:round(-22.5+45*(rand()))]" info:`
xoff=`convert xc: -format "%[fx:round(1000*rand())]" info:`
yoff=`convert xc: -format "%[fx:round(1000*rand())]" info:`
#echo >&2 "angle=$angle; xoff=$xoff; yoff=$yoff"
convert "$img" -resize 250x -background none -rotate $angle -set page +${xoff}+${yoff} miff:-
done
) | convert result.png - -layers merge +repage result.png


enter image description here

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

convert -size 1000x1000 xc:none \
\( lena.jpg barn.jpg mandril3.jpg zelda1.jpg -virtual-pixel none -background none \
+distort SRT "0,0 %[fx:250/w] %[fx:-22.5+45*rand()] %[fx:rand()*1000],%[fx:rand()*1000]" \) \
-layers merge +repage result.png


0 голосов
/ 30 октября 2019

Круто, я попробую скрипт fmw42, но это скрипт, который я придумал. Он генерирует временные файлы (которые он удаляет) и несколько команд преобразования, но он работает ....

# Create blank montage...
convert -size 750x750 xc:black montage.jpg


for file in $(ls hall*.jpg | grep -v halloweencovers.jpg); do
    echo $file

    angle=$RANDOM; let "angle %= 32"; let "angle = angle - 16"; let "angle = angle * 5"
    offsetx=$RANDOM; let "offsetx %= 75";let "offsetx = offsetx * 10"; offsetx="+$offsetx"
    offsety=$RANDOM; let "offsety %= 75";let "offsety = offsety * 10"; offsety="+$offsety"

    # Create blank image...
    convert -size 750x750 xc:transparent blank.png

    # create 250px image and rotate....
    convert $file -resize 250x -alpha set -background none -rotate $angle out.png

    # add 250px image to blank 750x750 canvas
    convert blank.png out.png -composite output.png

    # offset and wrap blank canvas with output image
    convert output.png -roll ${offsetx}${offsety} output2.png

    # merge montage with offset image
    convert montage.jpg output2.png -composite montage.jpg

    # clean up
    rm -f out.png output.png output2.png blank.png
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...