2016-12-26 13 views
1

Imagickを使用して正方形の画像をどのようにマスクすることが可能かを知る必要があります。ここで私がこれまで持っていますが、画像はちょうど適切にマスクされないコードは次のとおりです。生成されたImagick画像で画像をマスクする

は、正方形

$d = $image->getImageGeometry(); 
$src_width = $d['width']; 
$src_height = $d['height']; 
$thumbSize = min(max($src_width, $src_height), abs($thumbSize));   
if ($src_width < $src_height) { 
    $image->cropImage($src_width, $src_width, 0, (($src_height - $src_width)/2)); 
} else { 
    $image->cropImage($src_height, $src_height, (($src_width - $src_height)/2), 0); 
} 

に画像

$srcFile = 'filename.png'; 
$image = new Imagick($srcFile); 

クロップ画像を取得します。 画像のサイズを変更

$image->thumbnailImage($thumbSize, $thumbSize, 1); 
マスクされていない部分を埋める

bezier mask shape

function bezier($width, $height) { 
    $fillColor = "#000"; 
    $draw = new ImagickDraw(); 

クロップ/ベジェ形​​状

$image->compositeImage(bezier($thumbSize, $thumbSize), Imagick::COMPOSITE_COPYOPACITY, 0, 0); 

で画像をマスクベジェ関数は、このように見て形状を作成します黒色で

ベジエポイントは、中央の広場を埋めていない
$fillColor = new ImagickPixel($fillColor); 
    $draw->setFillColor($fillColor); 
    $smoothPointsSet = [ 
     [ 
      ['x' => 0.0 * $width, 'y' => 0.5 * $width], 
      ['x' => 0.0 * $width, 'y' => 0.905 * $width], 
      ['x' => 0.095 * $width, 'y' => 1.0 * $width], 
      ['x' => 0.5 * $width, 'y' => 1.0 * $width] 
     ], [ 
      ['x' => 0.5 * $width, 'y' => 1.0 * $width], 
      ['x' => 0.905 * $width, 'y' => 1.0 * $width], 
      ['x' => 1.0 * $width, 'y' => 0.905 * $width], 
      ['x' => 1.0 * $width, 'y' => 0.5 * $width] 
     ], [ 
      ['x' => 1.0 * $width, 'y' => 0.5 * $width], 
      ['x' => 1.0 * $width, 'y' => 0.095 * $width], 
      ['x' => 0.905 * $width, 'y' => 0.0 * $width], 
      ['x' => 0.5 * $width, 'y' => 0.0 * $width] 
     ], [ 
      ['x' => 0.5 * $width, 'y' => 0.0 * $width], 
      ['x' => 0.095 * $width, 'y' => 0.0 * $width], 
      ['x' => 0.0 * $width, 'y' => 0.095 * $width], 
      ['x' => 0.0 * $width, 'y' => 0.5 * $width] 
     ] 
    ]; 

    foreach ($smoothPointsSet as $points) { 
     $draw->bezier($points); 
    } 

ので

$imagick = new Imagick(); 
    $imagick->newImage($width, $width, "none"); 

新しい透明のImagick画像にコピー

$points = [ 
     ['x' => $width * 0.5, 'y' => 0.0], 
     ['x' => 0.0, 'y' => $height * 0.5], 
     ['x' => $width * 0.5, 'y' => $height], 
     ['x' => $width, 'y' => $height * 0.5] 
    ]; 
    $draw->polygon($points); 

手動で引き出しの画像を、それを埋めますここから私は様々な特性を実験しました。満足のいく結果が得られませんでした。イメージはほとんど常にマスクされません。

#$imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE); 
    #$imagick->setImageFormat("png"); 

    $imagick->drawImage($draw); 

    #$imagick->setImageMatte(false); 

    return $imagick; 
} 

問題があるとどのようにそれを修正する場所を私が知っていることができれば私は非常に喜んでいるだろう。残念ながら、私は問題を解決できませんでした

使用$dude->setImageMatte(1); Using a transparent PNG as a clip mask

使用$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); How to use Imagick to merge and mask images?

:私は私のために動作しませんでしたSO上のさまざまな答えを見つけました。

答えて

0

問題は、透明部分が黒になったので、画像はJPEGとして保存されたことでした。

$imagick = new Imagick(); 
$imagick->newImage($width, $width, "none"); 
$imagick->setImageBackgroundColor(new ImagickPixel('transparent')); 
#$imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE); 
$imagick->setImageFormat("png"); 

//Render the draw commands in the ImagickDraw object 
//into the image. 
$imagick->drawImage($draw); 
$imagick->negateImage(FALSE); 


return $imagick; 
+0

それはImageMagickのメーリングリストに投稿する価値があるでしょうが、あるいは自分のIRCチャンネルを打つ、または任意の直接接触の彼らの方法:関数ベジェで

$mask = bezier($thumbSize, $thumbSize); // Copy opacity mask if ($image->getImageMatte()) { $image->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); } else { $image->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0); } $image->setImageBackgroundColor(new ImagickPixel('white')); #$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); $image = $image->flattenImages(); 

:これは私が使用したコードです画像magickが使用された機能をサポートしていない形式で画像を保存したときにユーザーに警告しないことを知らせるためです。ビットマップにアルファチャンネルのある画像をJPEG形式で保存するには、コンソールの警告が表示されている必要があります。これにより、問題を直ちに特定して修正することができます。 –

+0

"は、画像magickが明らかにユーザーに「おそらく設計による」形式で画像を保存していることを警告しないことを知らせるためです。 ImageMagickが公開しているC APIの背後にある哲学は、ユーザーが何をしているのかを前提に、ユーザーが何をするかを指示することです。 Jpegのように透明な画像を保存するのは普通のことですが(ある時代)、ユーザーが意図したことを疑うのではなく、単にそれを行います。 – Danack

関連する問題