使用imagick PHP概述透明图像

时间:2015-11-24 07:48:59

标签: php image imagick outline

我有一个透明背景的图像,我想用5px边框勾勒出轮廓。在Photoshop中,我可以用它来实现这一点。

我尝试过使用category__ne='',但不会概述企鹅。

data = Data.objects(category__ne='').order_by('-datetime')[:500] 

这是图像。

tux original

这就是我想要实现的目标。

tux outlined

2 个答案:

答案 0 :(得分:5)

我将从命令行开始,稍后可能会运行PHP,或者让你解决这个问题......

第1步 - 提取透明度

如您所见,-border概述了整个图片,但您实际上只想概述不透明区域,因此您需要使用透明度或alpha层。让我们先提取:

convert tux.png -alpha extract alpha.png

enter image description here

第2步 - 获取不透明区域的边缘

现在,您需要概述的边缘,因此我将使用-morphology

convert alpha.png -morphology edge octagon -threshold 50% edge.png

enter image description here

我听说人们在PHP中的形态学操作有困难,所以这里有一个替代方法,不使用形态学。基本上,它复制了alpha图层,然后使用统计信息来查找每个3x3框中最亮的像素(这只会在3x3框中有一些黑色和一些白色像素的边缘处产生影响)然后差异原始结果显示受影响的像素。比描述更容易做到!

convert alpha.png \( +clone -statistic maximum 3x3 -threshold 50% \) -compose difference -composite edge.png

enter image description here

使用5x5的盒子作为更粗的行。

我看到有一个-edge 5选项更容易 - 我们生活和学习!

第3步 - 使边缘变红并保持透明

现在你希望白色为红色,黑色为透明:

convert edge.png -fill red -opaque white -transparent black rededge.png

enter image description here

第4步 - 复​​合原始的红色轮廓

最后,您希望将其复合到原始文件上:

convert tux.png rededge.png -composite result.png

enter image description here

整只猪

或者,您可以像这样一次性完成所有操作:

convert tux.png  \( +clone -alpha extract -morphology edge octagon -threshold 50% -fill red -opaque white -transparent black \) -composite result.png

您可能更喜欢-morphology edgeout-morphology edge的更微妙的影响。

PHP版

我的PHP技能"低" ,但我已经开始并且正在取得一些进展 - 稍后会更新,但到目前为止它看起来像这样:

   $image = new Imagick("tux.png");
   $alpha = clone $image;
   $alpha->separateImageChannel(Imagick::CHANNEL_ALPHA);
   $alpha->negateImage(true);
   $alpha->edgeImage(5);
   $alpha->opaquePaintImage("white","red",65000,FALSE);
   $alpha->transparentPaintImage("black",0.0,0,FALSE);
   $image->compositeImage($alpha,Imagick::COMPOSITE_DEFAULT,0,0);
   $image->writeImage("result.png");

这似乎非常有用,但有些方面可能会被整理 - 特别是65000幻数,也许还有一些不必要的克隆和东西 - 我会把它留给你!

答案 1 :(得分:0)

enter image description here函数getCharacterOutline(){

$imagick = new \Imagick(realpath("pen.png"));
$character = new \Imagick();
$character->newPseudoImage(
    $imagick->getImageWidth(),
    $imagick->getImageHeight(),
    "canvas:white"
);
$canvas = new \Imagick();
$canvas->newPseudoImage(
    $imagick->getImageWidth(),
    $imagick->getImageHeight(),
    "canvas:black"
);

$character->compositeimage(
    $imagick,
    \Imagick::COMPOSITE_COPYOPACITY,
    0, 0
);
$canvas->compositeimage(
    $character,
    \Imagick::COMPOSITE_ATOP,
    0, 0
);
$canvas->setFormat('png');

return $canvas;

}

$canvas = getCharacterOutline();
$kernel   =\ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_EDGE, 1, $kernel);
header("Content-Type: image/png"); 
echo $canvas->getImageBlob();
 [result][1]