Imagick compositeImage不适用原始宽度和高度但更小

时间:2015-11-29 14:36:24

标签: php imagick composite

我正在使用Imagick从2个png图像创建jpeg - 一个背景和一个背景。但是当我合成它时,$ image比原来小。我试过这个:

$image->scaleimage(
                        $image->getImageWidth() * 1.46,
                        $image->getImageHeight() * 1.47
                     );

和$ image的大小几乎相同。如果我不将$ image原始宽度和高度相乘,它们会更小。它应该是什么以及如何解决它?

我使用以下代码:

$image = new Imagick($_REQUEST['image']);

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->setBackgroundColor(new ImagickPixel('transparent'));

$image->scaleimage(
                    $image->getImageWidth(),
                    $image->getImageHeight()
                 );

$background = new Imagick($_REQUEST['background']);

$background->compositeImage($image, Imagick::COMPOSITE_ADD,0, 0);

$date = date('YMd'); $name = time().$rand;

$background->writeImage(DOCROOT.'assets/uploads/'.$date.'/'.$name.'.jpg'); 

$image->destroy();
$background->destroy();

当我var_dump($image->getImageWidth())var_dump($image->getImageHeight())时,会显示确切的宽度和高度。

已编辑:这是我的原始代码。问题是当2张图像合并为一张图像时,$ image的宽度和高度都比原始尺寸小。

我上面使用的宽度$image->scaleimage,我试图解决这个问题。我将它的宽度和高度宽度相乘一些,这样我就可以实现$ image的原始尺寸。

但是我的问题是为什么没有缩放$ image,它没有保留其原始的宽度和高度,但它们在sompositeImages之后变小了?

$image = new Imagick($_REQUEST['image']);

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->setBackgroundColor(new ImagickPixel('transparent'));

$background = new Imagick($_REQUEST['background']);
$background->compositeImage($image, imagick::COMPOSITE_ADD, 20, 10);

$date = date('YMd');$name = time().rand()&10000;
$background->writeImage(DOCROOT.'assets/uploads/'.$date.'/'.$name.'.jpg'); 

$image->destroy();
$background->destroy();

背景图片: enter image description here

图片是: enter image description here

当我将图像放在背景上时: enter image description here

Imagick就像那样复合 - 狗更小。 enter image description here

图像比原始尺寸小。

1 个答案:

答案 0 :(得分:1)

您的代码几乎肯定正在完成您告诉它的操作。

输出图像的大小与$background图像的大小相同....因为这是您将另一张图像合成的图像。

如果您希望顶部合成的图像与背景图像的尺寸相同,则将其缩放为背景图像的大小。

$image->scaleImage(
    $background->getImageWidth(),
    $background->getImageHeight()
);

而不是将它缩放到它已经是相同的大小....

  

图像比原始尺寸小。

合成图像不小。您正在将小图像合成为大图像。在您的网络浏览器中,然后缩小合成图像以显示,因为它太大而无法在适当的位置显示。这使得在中合成的图像显示更小,但实际上并不小。

如果您不希望缩小合成图像(包括您合成的图像到背景中),则应确保它适合您尝试显示的网页上的元素。

或者,您可以尝试将合成的图像放大到背景图像上......然而,这是多么合适.....但是我无法告诉您它应该缩放多少,你自己决定“正确”的大小是什么。