使用imagick扩展图像

时间:2018-06-30 13:34:14

标签: php imagick

我有一个尺寸为x和y的图像。 我想使用imagick将图像扩展到x和y + 10。 这里有一个实现此目的的示例:

http://phpimagick.com/Tutorial/edgeExtend

代码示例显示了如何水平延伸,而不是垂直延伸。

当我使用水平扩展示例时,它可以工作:

function EdgeExtendHorizontal(&$img)
{
$originalWidth=$img->getImageWidth();
$desiredWidth=$originalWidth+120;
$Factor=$originalWidth/$desiredWidth; 
$Offset=($desiredWidth-$originalWidth)/2;
$img->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_MIRROR);
$img->sampleimage($desiredWidth,$img->getImageHeight());
$points=array($Factor,0,0,1,$Offset,0);
$img->distortImage(Imagick::DISTORTION_AFFINEPROJECTION,$points,false);
}

enter image description here

但是,当我尝试切换参数以使图像垂直延伸时,它将不起作用:

function EdgeExtendVertical(&$img)
{
global $LanguageName;
$originalHeight=$img->getImageHeight();
$desiredHeight=$originalHeight+100;
$Factor=$originalHeight/$desiredHeight; 
$Offset=($desiredHeight-$originalHeight)/2;
$img->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_MIRROR);
$img->sampleimage($img->getImageWidth(),$desiredHeight);
$points=array(0,$Factor,0,1,0,$Offset);
$img->distortImage(Imagick::DISTORTION_AFFINEPROJECTION,$points,false);
}

enter image description here

如下修改点数组确实会带来结果:

$points=array($Factor,0,0,1,0,$Offset);

enter image description here

但是现在图像在垂直和水平方向都无法解释

如果有人可以阐明点数组的结构,使图像仅垂直延伸,我们将不胜感激。

谢谢!

Cymro

1 个答案:

答案 0 :(得分:1)

一次扩展宽度,高度或同时扩展两者的最简单的通用方法(PHP> = 5.4):

$im = new Imagick ("myfile.png");
$im->setImageVirtualPixelMethod (imagick::VIRTUALPIXELMETHOD_MIRROR);
list ($width, $height) = array_values ($im->getImageGeometry ());
$extend_width = 0;
$extend_height = 100;
$new_width = $width + $extend_width;
$new_height = $height + $extend_height;
$extend_width /= 2;
$extend_height /= 2;
$im->setImageArtifact ("distort:viewport", "{$new_width}x$new_height-$extend_width-$extend_height");
$im->distortImage (imagick::DISTORTION_SCALEROTATETRANSLATE, [0], false);
$im->writeImage (getcwd () . "/my_extended_image.png");

对于PHP <5.4,将以$ im-> distortImage()开头的行替换为:

$im->distortImage (imagick::DISTORTION_SCALEROTATETRANSLATE, array (0), false);

让我知道这是否行不通!干杯,李

相关问题