Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用imagick PHP勾勒出透明图像的轮廓_Php_Image_Imagick_Outline - Fatal编程技术网

使用imagick PHP勾勒出透明图像的轮廓

使用imagick PHP勾勒出透明图像的轮廓,php,image,imagick,outline,Php,Image,Imagick,Outline,我有一个透明背景的图像,我想用5px的边框勾勒出来。在photoshop中,我可以通过笔划来实现这一点 我尝试过使用borderImage,但它无法勾勒出企鹅的轮廓 $image = new Imagick(); $image->readImage('tux.png'); $image->borderImage(new ImagickPixel('red'), 5, 5); // no outline 这是图像 这就是我想要实现的目标 我将从命令行开始,稍后可能会执行PHP,或

我有一个透明背景的图像,我想用5px的边框勾勒出来。在photoshop中,我可以通过笔划来实现这一点

我尝试过使用
borderImage
,但它无法勾勒出企鹅的轮廓

$image = new Imagick();
$image->readImage('tux.png');

$image->borderImage(new ImagickPixel('red'), 5, 5); // no outline
这是图像

这就是我想要实现的目标


我将从命令行开始,稍后可能会执行PHP,或者让您完成这一部分

步骤1-提取透明度

如您所见,
-border
勾勒出整个图像,但实际上您只想勾勒出不透明区域,因此需要使用透明度或alpha层。让我们先把它提取出来:

convert tux.png -alpha extract alpha.png

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

现在,您需要轮廓的边缘,因此我将使用
-morphics

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

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

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

使用5x5的盒子来制作更肥的线条

我看到有一个
-edge 5
选项,它更简单-我们生活和学习

步骤3-使边缘变红,其余部分透明

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

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

第4步-在原始图像上合成红色轮廓

最后,您希望将其合成到原始图像上:

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

整只猪

或者,您可以一次完成所有操作,如下所示:

convert tux.png  \( +clone -alpha extract -morphology edge octagon -threshold 50% -fill red -opaque white -transparent black \) -composite result.png
   $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");
您可能更喜欢
-morphical edgeout
的更微妙效果,而不是
-morphical edge

PHP版本

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

convert tux.png  \( +clone -alpha extract -morphology edge octagon -threshold 50% -fill red -opaque white -transparent black \) -composite result.png
   $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
神奇数字,可能还有一些不必要的克隆和其他东西-我将把这留给你

函数getCharacterOutline(){

}


形态学的东西有一个例子在这里伟大的解决方案!我一直试图在PHP中复制它,但没有成功。你能把它转换成PHP吗?我尝试了一些业余的PHP-我将离开你去提高它的生产质量:-)很棒的东西,马克!我很感激。如果需要,请随时更新。步骤3不起作用-我得到一个空的输出图像:/n您可以制作多薄的轮廓?您可以制作多薄的轮廓?