使用Image Magick

时间:2015-10-23 14:45:28

标签: php image-processing imagemagick imagemagick-convert

我是php的ImageMagick和Imagick库的新手,我想知道如何让一切都透明,但只留下png图像中的形状边缘。

例如我有这张照片:enter image description here

我想只留下由鹰的边缘形成的细线,并用透明的颜色填充鹰的内部。

或者作为替代方案,我如何使用带有php和GD库的Image Magick库将黑鹰颜色更改为不透明度为0.4的棕色rgba颜色?

3 个答案:

答案 0 :(得分:0)

这样可以检测边缘:

convert eagle.png --edge 3 eagle-edges.png

在PHP中,您可以使用bool Imagick::edgeImage(float $radius)

答案 1 :(得分:0)

我设法用这些命令得到了结果,虽然我还没有在其他图像上进行过测试,只有老鹰的那个。

exec('convert eagle.png -charcoal 1 neweagle.png');
exec('convert neweagle.png -transparent white neweagle.png'); 

我对其他更好的解决方案持开放态度!

如果有人知道如何在没有exec的情况下从php库中执行这些命令,那也会很棒。

答案 2 :(得分:0)

选项1

如果你想让鹰的轮廓变黑并且其他一切都是透明的,你可以使用它:

convert eagle.png -channel RGBA -separate -delete 0-2 -edge 1 -threshold 1 -transparent black +channel -negate result.png

enter image description here

将图像分离为RGBA通道并丢弃除alpha通道以外的所有通道。然后它找到alpha通道的边缘(在黑色上显示为白色)然后使黑色像素透明并将白色像素反转为黑色。

我的PHP实现如下:

<?php
// convert eagle.png -channel RGBA -separate -delete 0-2 -edge 1 -threshold 1 -transparent black +channel -negate result.png
   $image=new Imagick('eagle.png');
   $image->separateimagechannel(Imagick::CHANNEL_OPACITY);
   $image->edgeImage(1);
   $image->thresholdImage(1);
   $image->transparentPaintImage("black",0.0,10,false);
   $image->negateImage(false);
   $image->writeimage('result.png');
?>

选项2

如果你想让鹰的黑色身体变成40%不透明的深棕色,你可以这样做:

convert eagle.png -channel RGBA -fill "rgba(101,67,33,0.4)" -fuzz 10% -opaque black result.png

enter image description here

我的PHP实现如下:

<?php
// convert eagle.png -channel RGBA -fill "rgba(101,67,33,0.5)" -fuzz 10% -opaque black answer2.png
   $image=new Imagick('eagle.png');
   $image->opaquePaintImage("black","rgba(101,67,33,0.4)",10,false,imagick::CHANNEL_ALL);
   $image->writeimage('result2.png');
?>