2017-10-05 8 views
1

Je souhaite associer une image à une autre avec transparence. Par conséquent, j'utilise Imagick avec PHP.Imagick perd de la transparence lors de l'utilisation de setImageOpacity et composeImage

Voici ce que je reçois: imagick result

Voici ce que je veux: expected result

Est-ce que quelqu'un a une réponse, pourquoi la transparence du $ imageTransparent se perd après avoir utilisé setImageOpacity()?

Voici mon code:

$image = new \Imagick(); 
$imageTransparent = new \Imagick(); 

$background = new \ImagickPixel('rgba(0,0,255,1)'); 
$image->newImage(600, 400, $background); 

$background = new \ImagickPixel('rgba(255,255,255,0)'); 
$imageTransparent->newImage(600, 400, $background); 

$draw = new \ImagickDraw(); 
$draw->setFillColor('#ff0000'); 
$draw->polygon(array(
    array('x' => 50, 'y' => 50), 
    array('x' => 400, 'y' => 50), 
    array('x' => 50, 'y' => 300), 
)); 

$imageTransparent->drawImage($draw); 
$imageTransparent->setImageOpacity(0.5); 

$image->compositeImage($imageTransparent, \Imagick::COMPOSITE_DEFAULT, 0, 0); 

EDIT: Je ne veux pas mettre la transparence dans le DrawObject! $ imageTransparency pourrait être n'importe quoi. par exemple. un fichier PNG avec un arrière-plan transparent.

Je veux un fondu enchaîné: http://www.imagemagick.org/Usage/compose/#dissolve

Répondre

0

Je ne sais pas Imagick que bien, mais essayez d'utiliser un fond bleu opaque sur votre image transparente puis dessinez un demi-triangle rouge transparent sur elle. (Vous définissiez l'image de sortie entière à la moitié de la transparence et en utilisant un arrière-plan blanc transparent sur l'image plus petite). Note J'ai supprimé votre ligne $imageTransparent->setImageOpacity(0.5);

$image = new \Imagick(); 
$imageTransparent = new \Imagick(); 

$background = new \ImagickPixel('rgba(0,0,255,1)'); 
$image->newImage(600, 400, $background); 

$background = new \ImagickPixel('rgba(0,0,255,1)'); 
$imageTransparent->newImage(600, 400, $background); 

$draw = new \ImagickDraw(); 
$draw->setFillColor('rgba(255,0,0,0.5)'); 
$draw->polygon(array(
    array('x' => 50, 'y' => 50), 
    array('x' => 400, 'y' => 50), 
    array('x' => 50, 'y' => 300), 
)); 

$imageTransparent->drawImage($draw); 

$image->compositeImage($imageTransparent, \Imagick::COMPOSITE_DEFAULT, 0, 0); 

ci-dessus doivent être l'équivalent de la ligne de commande Imagemagick suivante:

convert \ 
\(-size 600x400 xc:blue \) \ 
\(-size 600x400 xc:blue -fill "rgba(255,0,0,0.5)" \ 
    -draw "polygon 50,50 400,50 50,300" \) \ 
-composite test.png 

qui produit le résultat suivant:

enter image description here

+0

Merci, mais ce n'est pas ce que je veux: $ draw-> setFillColor ('rgba (255,0,0,0.5)'); Disons $ imageTransparent est une image chargée à partir de PNG;) – luggi

1

En Ligne de commande Imagemagick si vous souhaitez réduire la transparence d'une image de 50%, vous devez sélectionner la d multipliez-le par 0,5, puis rallumez tous les canaux.

Voici un logo Imagemagick transparent (avec fond blanc rendu transparent).

enter image description here

convert \ 
\(-size 600x400 xc:blue \) \ 
\(logot.png -channel a -evaluate multiply 0.5 +channel \) \ 
-composite test2.png 

enter image description here

Par rapport à ne pas changer le canal alpha et juste compostage:

convert \ 
\(-size 600x400 xc:blue \) \ 
\(logot.png \) \ 
-composite test1.png 

enter image description here

Désolé, je ne sais pas les commandes équivalentes en Im agick. Mais voir Imagick :: evaluateImage