使用imagick PHP勾勒出透明图像的轮廓
我有一个透明背景的图像,我想用5px的边框勾勒出来。在photoshop中,我可以通过笔划来实现这一点 我尝试过使用使用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,或
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您可以制作多薄的轮廓?您可以制作多薄的轮廓?