Объедините 2 изображения рядом в 1 с помощью ImageMagick (PHP)


Я думаю, что это очень просто.

У меня есть 2 изображения/JPG, и я хочу, чтобы они слились в одно изображение, где 2 находятся рядом.

Итак, у меня есть pic [A] и pic [B], и я хочу получить pic [AB] (бок о бок).

Оба изображения имеют одинаковую ширину и высоту. В этом случае ширина=200 пикселей и высота=300 пикселей. Но 2-е изображение должно отображаться в позиции 200,0.. также, когда ширина изображения меньше 200 пикселей (200 пикселей - максимальная ширина)

Это то, что я пробовал (php):

exec($IMAGEMAGICK_PATH."composite picA.jpg -geometry +200+0 picB.jpg picAB.jpg");

Я также попробовал то же самое с "размером 400x300" после "композитный", но ничего не происходит. Проблема в том, что изображение picA.jpg перемещается на 200 пикселей и объединяется в picB.jpg, но ширина picAB.jpg это то же самое, что picB.jpg есть.

Я также не уверен, что "-геометрия" является правильной командой.

Author: John Doe Smith, 2012-08-22

4 answers

Вот командная строка для добавления изображения в соответствии с расширенными требованиями, где правое изображение должно быть смещено на 200 пикселей от левого края, независимо от (меньшей) ширины левого изображения:

 convert                          \
   -background '#FFF9E3'          \
    xc:none -resize 200x1\!       \
    right+narrow.png -append      \
    left+wider.png                \
   -gravity south                 \
   +append                        \
   -crop '400x +0+1'              \
   +repage                        \
    result.png

Часть xc:none -resize 200x1\! создает линию высотой 1 пиксель и длиной 200 пикселей и вертикально добавляет к ней меньшее (правое) изображение.

К этому промежуточному результату происходит горизонтальное добавление более широкого (левого) изображения. Теперь у нас была бы картинка размером 401х100 с возможно, уродливая линия прозрачных пикселей сверху.

Вот почему мы срезаем эту верхнюю пиксельную линию с помощью функции -crop.

Вы должны быть в состоянии перевести это на PHP самостоятельно... :-)

 3
Author: Kurt Pfeifle, 2015-02-24 12:54:18

Нет необходимости использовать -geometry, если оба файла имеют одинаковый размер. Попробуйте

exec($IMAGEMAGICK_PATH."convert picA.jpg picB.jpg +append picAB.jpg");

Используйте -append, если вы хотите объединить изображения в столбце.

Добавьте -background none или -background black или -background white или что угодно, если ваши фотографии не одинакового размера. В этом случае вы также можете добавить -gravity center или -gravity south или что-то подобное, чтобы контролировать, как именно сливаются два изображения. -gravity должен появиться перед +-append в командной строке, затем:

exec($IMAGEMAGICK_PATH."convert big.jpg small.jpg -gravity east -append 2x.jpg");
 14
Author: Kurt Pfeifle, 2012-08-22 15:29:30

Возможно, вам будет легче понять метод montage (вероятно, это то, что вы имели в виду, когда пробовали его с composite - но этот метод предназначен для перекрывающихся изображений, а не для параллельного монтажа...)

montage                 \
  -background '#FFF9E3' \
  -geometry 200\!x\>    \
  -gravity west         \
   right+narrow.jpg     \
   left+wider.jpg       \
   result.jpg
 3
Author: Kurt Pfeifle, 2012-08-22 17:29:23

Вот PHP-код, который я использую в Kinoulink (французский стартап):

$im1 = new \Imagick($media1);
$im2 = new \Imagick($media2);
$imTotal = new \Imagick();

$im1->cropthumbnailimage(62, 128);
$im2->cropthumbnailimage(62, 128);

$imTotal->newimage(128, 128, '#ffffffff');

$imTotal->compositeimage($im1, \Imagick::COMPOSITE_DEFAULT, 0, 0);
$imTotal->compositeimage($im2, \Imagick::COMPOSITE_DEFAULT, 66, 0);

$imTotal->writeimage($albumCoverFilePath);
 3
Author: Thomas Decaux, 2013-07-10 17:41:09