【问题标题】:How to fill the closed regions by a border color when outlining a transparent image using Imagick PHP使用 Imagick PHP 勾勒透明图像时如何用边框颜色填充封闭区域
【发布时间】:2019-12-30 11:29:12
【问题描述】:

我想用 20 像素的边框在透明背景中勾勒出一个对象的轮廓。但是,我想用边框颜色填充封闭区域。

$image = new Imagick('./img/hinata.png');
$mask = clone $image;
$mask->separateImageChannel(Imagick::CHANNEL_ALPHA);
$mask->negateImage(true);
$mask->edgeImage(20);
$mask->opaquePaintImage("white","blue",65000,false);
//// TODO: I don't know how to fill the holes
$mask->transparentPaintImage("black",0.0,0,false);
$image->compositeImage($mask,Imagick::COMPOSITE_DEFAULT,0,0);

我引用了这个问题: Outline a transparent image using imagick PHP

这是图片:

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

这不是我想要实现的:

【问题讨论】:

  • 请发布您的原始输入,而不是用棋盘代替透明度的输入。提取 alpha 通道,然后使用形态扩张来扩展它。然后使用连接的组件来填充孔。

标签: php image imagemagick imagick


【解决方案1】:

这就是我在 ImageMagick 命令行中的做法。

Make the background under the transparency blue.

Extract the alpha channel.

Dilate the alpha channel.

Use connected components to fill in any "holes" smaller than some threshold in area.

Replace the old alpha channel with the new one


输入:from here

convert cartoon_girl.png -background blue -alpha background \
\( -clone 0 -alpha extract \
-morphology dilate diamond:12 \
-define connected-components:mean-color=true \
-define connected-components:area-threshold=500 \
-connected-components 8 \) \
-alpha off -compose copy_opacity -composite \
result.png


不幸的是,据我所知,Imagick 不支持连接组件。所以唯一的另一种方法是在每个“洞”内的某个点使用洪水填充。这意味着您必须在每个孔内选择 x,y 坐标以用于在进行扩张后进行洪水填充。见https://www.php.net/manual/en/imagick.floodfillpaintimage.php

convert cartoon_girl.png -background blue -alpha background \
\( -clone 0 -alpha extract \
-morphology dilate diamond:12 \
-fuzz 80% -fill white \
-draw "color 100,310 floodfill" \
-draw "color 200,235 floodfill" -alpha off  \) \
-alpha off -compose copy_opacity -composite \
result2.png


【讨论】:

  • 很有帮助! FloodFill 正是我一直在寻找的方法。我在 PHP 中找到了它,方法是 Imagick::floodFillPaintImage()。如果我可以指定孔中心的坐标,我想我就可以填充它们。谢谢!
  • 是的,指向 Imagick::floodFillPaintImage() 的链接已经在我的回答中。
猜你喜欢
  • 2016-02-26
  • 2012-06-22
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多