четверг, 6 декабря 2012 г.

Мозаика из фотографий с помощью convert (imageMagic)

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

#!/bin/bash
 
SW=150
SH=150
FROMDIR="fromdir"
TODIR="todir"
 
for name in $(ls $FROMDIR); do convert -resize ${SW}x${SW} -strip $FROMDIR/$name $TODIR/$name; done

Здесь
SW - ограничение ширины миниатюры; SH - ограничение высоты миниатюры; FROMDIR - каталог, в котором находятся фотографии; TODIR - каталог, в который будут сложены миниатюры.

Далее скрипт, который по миниатюрам создает мозаику:

#!/bin/bash
 
SW=150
SH=112
COLS=15
REZFILE="mosaic-`date "+%Y-%m-%d_%H_%M_%S"`.jpg"
FDIR="small"
 
 
$(echo "convert $(i=0 && for name in $(ls $FDIR | sort -R); do echo -n " -page +$[($i%$COLS)*$SW]+$[(($i-$i%$COLS)/$COLS)*$SH] $FDIR/$name" && i=$[$i+1]; done) -mosaic $REZFILE")

Здесь
SW - ширина миниатюры; SH - высота миниатюры; COLS - количество столбцов; REZFILE - файл с мозаикой; FDIR - каталог миниатюрами.
Еще раз напомню, все миниатюры должны быть одинакового размера. Иначе будут пустоты.
Что бы мозаика повторяла пропорции исходных фотографий должно быть
SW==SH
Число фотографий должно равняться произведению
SW*SH
В последнем скрипте sort -R для случайного упорядочивания. Если его убрать, будет тот порядок, в котором выдает ls.
Вот пример мозаики из аватарок пользователей сайта: