使用ImageMagick(PHP)将2张图像并排放入1

时间:2012-08-22 15:17:09

标签: php imagemagick

我认为这很容易。

我有2张图片/ JPG,我希望它们合并成一张并排的图片。

所以我有pic [A]和pic [B],我想获得图片[AB](并排)。

两幅图像的宽度和高度相同。在这种情况下,宽度= 200px,高度= 300px。 但第二张图像应出现在位置200,0 ..当图像宽度小于200像素(200像素是最大宽度)时

这就是我尝试过的(php):

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

我也尝试过“复合”之后的“-size 400x300”,但没有任何反应。 问题是图像picA.jpg被移动200px并合并到picB.jpg,但picAB.jpg的宽度与picB.jpg相同。

我也不确定“-geometry”是否是正确的命令。

4 个答案:

答案 0 :(得分:14)

如果两个文件的大小相同,则无需使用-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");

答案 1 :(得分:3)

这是一个命令行,由于扩展要求而执行图像附加,其中右图像应偏离左边缘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像素长的线,并垂直附加较小(右)的图像。

对于该中间结果,发生较宽(左)图像的水平附加。我们现在有一张401x100的照片,顶部有一条可能很难看的透明像素。

这就是我们使用-crop函数削减这个顶部像素行的原因。

你应该能够自己将它翻译成PHP ......: - )

答案 2 :(得分:3)

也许您会发现montage方法更容易理解(这可能就是您在使用composite时尝试过的方法 - 但那个方法是重叠图像,不是并排蒙太奇......)

montage                 \
  -background '#FFF9E3' \
  -geometry 200\!x\>    \
  -gravity west         \
   right+narrow.jpg     \
   left+wider.jpg       \
   result.jpg

答案 3 :(得分:3)

这里我在Kinoulink(法国初创公司)使用的PHP代码:

$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);