2015-11-24 21 views
7

透明な背景の画像を5pxの枠で囲んでいます。フォトショップでは、これを達成するためにストロークすることができます。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が全体の画像をの画像に概説していますが、実際にはの不透明な領域しか輪郭を描きたくないので、透明またはアルファのレイヤーで作業する必要がありますr。あなたはそれのエッジが概説したい、今の不透明なエリア

のエッジを取得するので、私は-morphologyを使用します -

convert tux.png -alpha extract alpha.png 

enter image description here

ステップ2:

をさんは、それが最初に抽出してみましょう
convert alpha.png -morphology edge octagon -threshold 50% edge.png 

enter image description here

PHPで形態素操作に問題があると聞いていますので、ここでは形態を使用しないこの手順の代替方法です。基本的には、アルファレイヤーを複製し、統計を使用して各3x3ボックス内の最も明るいピクセルを探します(3x3ボックスに黒色と白いピクセルがあるエッジでのみ効果があります)。そして、影響を受けたピクセルを表示する元の結果。説明するだけで簡単にできます!

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

enter image description here

太っラインの5x5のボックスを使用します。

-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