web-dev-qa-db-fra.com

Comment utiliser Imagick pour fusionner et masquer des images?

Je connais très peu de choses sur le traitement des images et encore moins sur la terminologie utilisée. Veuillez donc supporter. 

Fondamentalement, je veux fusionner deux images ensemble, l’une d’elles servant de masque. Cette image ressemble à ceci:
Example
Où le fond bleu et jaune sont tous deux transparents dans la réalité.

Cette image est utilisée comme masque pour les photos ordinaires. Les parties de la photo qui "dépassent" du cercle doivent être "rognées" (rendues invisibles), tandis que l'intérieur reste visible.
Ainsi, tout ce qui vient dans la zone bleue est invisible, tout ce qui se trouve dans la zone jaune est visible.

Honnêtement, je n'ai aucune idée de la façon de procéder, alors toute aide serait grandement appréciée!

Modifier:
J'utilise la version API d'Imagick, pas la version en ligne de commande

Modifier:
Pour avoir une idée de ce que je veux réaliser, voici un exemple.

Les images d'entrée sont donc:
enter image description here
Ceci est l'image du masque, toujours la même 

enter image description here
Ceci est un exemple d'image dynamique

enter image description here
Voici à quoi devrait ressembler le résultat final 

25
Dennis Haarbrink

Donc, finalement, cela devrait faire ce dont vous avez besoin:

Image originale:

http://i.stack.imgur.com/b7seR.png

Masque d'opacité:

enter image description here

Superposition:

http://i.stack.imgur.com/3ulkM.png

Sortie:

enter image description here

Le code:

<?php
$base = new Imagick('U0R4F.png');
$mask = new Imagick('mask.png');
$over = new Imagick('3ulkM.png');

// Setting same size for all images
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1);

// Copy opacity mask
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// Add overlay
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0);

$base->writeImage('output.png');
header("Content-Type: image/png");

echo $base;
?>

J'espère que c'est maintenant! Remarque: Dans votre exemple, il semble que vous ayez réduit l'image de base, ce que je n'ai pas fait (mon objectif est simplement de montrer comment le masquage est effectué).

62
user703016

Avez-vous essayé cette solution ici comme décrit par: https://stackoverflow.com/a/2351173/1093649 ?

Exécutez ceci sur votre serveur (avec les bons noms d'images!), Et faites-le nous savoir, merci.

nb: les crédits vont à jspash

1
Justin T.

Ce type de masquage est décrit à l'aide d'un certain nombre de techniques différentes dans Exemples ImageMagick, Vignettes, Masque et Peinture http://www.imagemagick.org/Usage/thumbnails/#mask_Paint

Soyez averti cependant que le masquage et les bords de l'image de surimpression NE DEVRAIT PAS ÊTRE CORRESPONDANTS C'est important sinon vous pouvez avoir des problèmes avec les effets de crénelage des bords qu'il vaut mieux éviter.

Pour extraire un masque alpha de l'anneau, vous pouvez utiliser des opérateurs de morphologie pour l'amincir à un trait d'axe. Cet masque peut également être utilisé pour générer un masque pour toute forme d'anneau aléatoire. . http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

Anthony Thyssen Webmestre pour les exemples ImageMagick et développeur pour ImageMagick

PS: Jolie photo d'Elfling

0
anthony

http://www.imagemagick.org/Usage/compose/#dstin devrait faire l'affaire, mais vous devez utiliser des images avec des canaux alpha (cela ne devrait pas poser de problème).

Edit: dans PHP, vous devez le transmettre (imagick::COMPOSITE_DSTIN) en tant que paramètre dans compositeimage . D'autres filtres dans Constantes d'opérateur composites peuvent également vous être utiles.

0
Viruzzo