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 le garder tel quel et lui appliquer un" masque", la deuxième image. Cette deuxième image n'a pas de pixels opaques, en fait elle est presque complètement transparente, elle a juste quelques pixels moins transparents pour donner une sorte d ' "effet de lumière", comme un réflexe. Détail Important: Je ne veux pas faire cela à l'écran, avec des graphiques, je dois obtenir un BufferedImage avec la fusion résultante.

quelqu'un Peut-il m'aider? Merci!

détails: fusionner deux images en maintenant la transparence. C'est ce que je dois faire.

Note: Ce Set BufferedImage alpha mask En Java ne fait pas ce dont j'ai besoin parce qu'il ne fonctionne pas bien avec les deux images ayant la transparence - il modifie la transparence première image.

74
demandé sur Community 2010-02-23 15:24:42

3 réponses

il suffit de créer un nouveau tampon avec transparence, puis de peindre les deux autres images (avec pleine ou semi-transparence) dessus. Voici à quoi il ressemblera:

Image plus overlay

exemple de code (les images sont appelées 'image.png' et 'de superposition.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"));
162
répondu Peter Walser 2017-03-06 00:53:54

sans en savoir plus sur l'effet que vous tentez d'obtenir, je vais juste souligner que vous pouvez également tirer à droite sur un BufferedImage. Donc tout ce que vous pouvez faire à l'écran, vous pouvez le faire directement sur l'image elle-même.

donc si tout ce que vous voulez est un dessin sur l'autre, c'est vraiment facile. Il suffit de saisir l'objet graphique pour l'image de base et de dessiner l'autre sur elle.

Encore une fois, selon l'effet que vous allez pour qui ne peuvent pas travail. Plus de détails permettraient une meilleure aide. Par exemple, est-ce une tâche pour AlphaComposite que l'autre répondant mentionne ou un ImageOp personnalisé (ou une combinaison d'ImageOps existants).

3
répondu PSpeed 2010-02-23 12:54:54

Je ne peux pas vous donner une réponse précise, mais java.awt.AlphaComposite est votre ami. Vous aurez le contrôle absolu sur la façon dont vous voulez que les deux images fusionnent. Cependant, il n'est pas simple à utiliser - vous devez apprendre un peu de théorie graphique d'abord.

2
répondu Steve McLeod 2010-02-23 12:43:49