web-dev-qa-db-fra.com

Fusion de deux images

Je dois fusionner deux images (BufferedImage) en Java. Ce ne serait pas un problème s'il n'y avait pas de transparence. L'image de base a déjà une certaine transparence. Je veux garder cela tel quel et y appliquer un "masque", la deuxième image. Cette seconde image ne contient pas de pixels opaques. En fait, elle est presque complètement transparente. Il y a juste des pixels moins transparents qui donnent une sorte "d'effet de lumière", comme un réflexe. Détail important: je ne veux pas faire cela à l'écran, avec les graphiques, je dois obtenir une image BufferedImage avec la fusion résultante.

Quelqu'un peut-il m'aider? Merci!

DÉTAILS: Fusionnez deux images en maintenant la transparence. C'est ce que je dois faire.

Remarque: this Définir le masque alpha de BufferedImage en Java ne fait pas ce dont j'ai besoin car il ne gère pas bien les deux images ayant une transparence - il modifie la première transparence de l'image.

78
GuilhermeA

Créez simplement une nouvelle BufferedImage avec transparence, puis peignez les deux autres images (avec transparence totale ou semi-transparente) dessus. Voici à quoi ça va ressembler:

Image plus overlay

Exemple de code (les images s'appellent 'image.png' et 'overlay.png'):

File path = ... // base path of the images

// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));

// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

// Paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);

// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));
172
Peter Walser

Je ne peux pas vous donner de réponse précise, mais Java.awt.AlphaComposite est votre ami. Vous obtiendrez un contrôle absolu sur la manière dont vous souhaitez fusionner les deux images. Toutefois, son utilisation n’est pas simple: vous devez d’abord apprendre un peu la théorie des graphiques.

3
Steve McLeod

Sans en savoir plus sur l'effet que vous essayez d'obtenir, je vous ferai remarquer que vous pouvez également tirer directement sur un BufferedImage. Donc, tout ce que vous pouvez faire à l'écran peut être fait directement sur l'image elle-même.

Donc, si tout ce que vous voulez, c'est dessiner l'un sur l'autre, c'est vraiment facile. Il suffit de saisir l’objet Graphics de l’image de base et d’attirer l’autre sur celle-ci.

Encore une fois, cela peut ne pas fonctionner en fonction de l'effet recherché. Plus de détails permettraient une meilleure aide. Par exemple, s'agit-il d'un travail pour AlphaComposite comme le mentionne l'autre répondant ou d'un ImageOp personnalisé (ou une combinaison d'ImageOps existante).

3
PSpeed