我有一個透明背景的圖像,我想用5px邊框進行概述。在Photoshop中,我可以用它來實現這一點。使用imagick概述透明圖像PHP
我試過使用borderImage
但它不會勾勒出企鵝。
$image = new Imagick();
$image->readImage('tux.png');
$image->borderImage(new ImagickPixel('red'), 5, 5); // no outline
這是圖像。
這是我想達到的目標。
我有一個透明背景的圖像,我想用5px邊框進行概述。在Photoshop中,我可以用它來實現這一點。使用imagick概述透明圖像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步 - 獲取不透明區域
的邊緣現在,你要的那個邊緣概括,所以我將使用-morphology
:
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
使用5×5盒爲一個胖線。
我看到有一個-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
您可能更喜歡-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
魔法數字,也許一些不必要的克隆和東西 - 我會留給你的!
形態的東西在這裏有一個例子http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack