【问题标题】:Imagick - soft polygon edges with image maskimagick - 带有图像蒙版的软多边形边缘
【发布时间】:2015-12-01 09:59:14
【问题描述】:

如何使用 setImageClipMask 绘制边缘平滑的图像?

我的代码生成如下:

在剪辑蒙版的边缘处有尖锐的锯齿状边缘。

我正在使用的代码:

// Draw clip mask
$clipMask = new \Imagick();
$clipMask->newPseudoImage($width, $height, "canvas:white");
$draw = new \ImagickDraw();
$draw->setFillColor(new ImagickPixel('black'));
$draw->polygon($myCoordinates);
$clipMask->drawImage($draw);

// Set mask
$img_main->setImageClipMask($clipMask);

// Draw image
$img_main->compositeImage($myImage, Imagick::COMPOSITE_DEFAULT, $x, $y);

【问题讨论】:

    标签: php mask imagick


    【解决方案1】:

    tl:dr 不要使用蒙版,而是使用渐变。

    口罩是二元选择;像素要么通过,要么不通过,并且设计为具有锐利的边缘。

    渐变(不必是线性的)允许平滑地应用效果。下面的代码生成一个渐变,然后用它在两个图像之间平滑地混合。

    渐变生成:

    输出图像:

    <?php
    
    
    $background = new \Imagick(realpath('./Skyline_400.jpg'));
    $overlay = new \Imagick(realpath('./background.jpg'));
    
    $overlay->scaleimage(
        $background->getImageWidth(),
        $background->getImageHeight()
    );
    
    $gradient = createGradient($background);
    
    //If you need to see the gradient for debugging.
    $gradient->setImageFormat("png");
    $gradient->writeImage("./gradient.png");
    
    $gradient2 = clone $gradient;
    //The overlay needs to have the gradient reversed
    $gradient2->negateimage(false);
    $gradient2->setImageAlphaChannel(\Imagick::ALPHACHANNEL_DEACTIVATE);
    $background->compositeImage($gradient2, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
    
    $gradient->setImageAlphaChannel(\Imagick::ALPHACHANNEL_DEACTIVATE);
    $overlay->compositeimage($gradient, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
    
    //Create a new canvas to render everything in to.
    $canvas = new \Imagick();
    $canvas->newImage($gradient->getImageWidth(), $gradient->getImageHeight(), new \ImagickPixel('black'));
    
    //Blend background into canvas
    $canvas->compositeimage($background, \Imagick::COMPOSITE_BLEND, 0, 0);
    
    //Blend overlay into canvas
    $canvas->compositeimage($overlay, \Imagick::COMPOSITE_BLEND, 0, 0);
    
    //Output the final image
    $canvas->setImageFormat('png');
    $canvas->writeImage("./output_test.png");
    
    
    
    // Create a gradient/mask to allow images to be blended smoothly.
    function createGradient(\Imagick $background)
    {
        $myCoordinates = [
            ['x' => 20, 'y' => 20,],
            ['x' => 360, 'y' => 20,],
            ['x' => 350, 'y' => 350,],
            ['x' => 25, 'y' => 350,],
        ];
    
        $backgroundMask = new \Imagick();
        $backgroundMask->newPseudoImage(
            $background->getImageWidth(), 
            $background->getImageHeight(),
            'canvas:white'
        );
    
        $draw = new \ImagickDraw();
        $draw->setFillColor(new ImagickPixel('black'));
        $draw->polygon($myCoordinates);
        $backgroundMask->setImageFormat('png');
        $backgroundMask->drawImage($draw);
    
        // Blur the edges to make the transition between black and white 
        // be smooth
        $backgroundMask->blurImage(2, 0.5);
    
        return $backgroundMask;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2021-08-22
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2012-12-10
      相关资源
      最近更新 更多