代码之家  ›  专栏  ›  技术社区  ›  Cymro

使用imagick扩展图像

  •  1
  • Cymro  · 技术社区  · 6 年前

    我有一张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

    但现在这幅图像在垂直和水平方向上都被莫名其妙地扩展了

    如果有人能对点阵列的结构做些解释,使图像只在垂直方向上延伸,那将非常感谢。

    谢谢!

    西姆罗

    1 回复  |  直到 6 年前
        1
  •  1
  •   Lee Traynor    6 年前

    同时扩展宽度和/或高度的最简单通用方法(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->rtharmage()开头的行替换为:

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

    如果不行就告诉我!干杯,李