2015-11-24 52 views
7

我有一個透明背景的圖像,我想用5px邊框進行概述。在Photoshop中,我可以用它來實現這一點。使用imagick概述透明圖像PHP

我試過使用borderImage但它不會勾勒出企鵝。

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

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

這是圖像。

tux original

這是我想達到的目標。

tux outlined

+0

形態的東西在這裏有一個例子http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack

回答

5

我會在命令行啓動以後可能會做PHP,或者讓你的工作,有點不......

第1步 - 提取透明度

由於您已經看到,-border概述了整個圖像,但您實際上只想勾勒出不透明的區域,因此您需要使用透明度或Alpha透明膠片河讓我們提取第一:

convert tux.png -alpha extract alpha.png 

enter image description here

第2步 - 獲取不透明區域

的邊緣現在,你要的那個邊緣概括,所以我將使用-morphology

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

enter image description here

我聽說過人們在PHP中進行形態操作時遇到困難,所以這裏是另一種不使用形態學的步驟。基本上,它會複製alpha層,然後使用統計信息來查找每個3x3框中最亮的像素(這隻會在3x3框中存在一些黑色和一些白色像素的邊上產生效果),然後區別用原始結果顯示受影響的像素。比描述更容易做!

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

enter image description here

使用5×5盒爲一個胖線。

我看到有一個-edge 5選項,這是更容易 - 我們生活和學習!

第3步 - 使圖像邊緣的紅色和休息透明

現在,你想白是紅色和黑色是透明的:

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

enter image description here

第4步 - 原複合紅色輪廓

最後,你想複合,超過您最初的:

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

enter image description here

整個生豬

或者,你可以做到這一切在一個這樣的:

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魔法數字,也許一些不必要的克隆和東西 - 我會留給你的!

+0

偉大的解決方案!我一直試圖複製它在PHP中無濟於事。你可以將它轉換爲PHP嗎? – steve

+0

我已經嘗試了一些業餘PHP - 我會留下你來提高它的生產質量:-) –

+0

偉大的東西,馬克!我很感激。如果需要,請隨時更新。 – steve