2010-02-23 13 views
72

Ho bisogno di unire due immagini (BufferedImage) in Java. Non sarebbe un problema se non ci fosse trasparenza. L'immagine di base ha già una certa trasparenza. Voglio mantenere questo com'è e applicare una "maschera" ad esso, la seconda immagine. Questa seconda immagine non ha pixel opachi, infatti è quasi completamente trasparente, ha solo alcuni pixel meno trasparenti per dare una sorta di "effetto di luce", come una reflex. Dettaglio importante: non voglio farlo sullo schermo, con la grafica, ho bisogno di ottenere una BufferedImage con la fusione risultante.Unione di due immagini

Qualcuno può aiutarmi? Grazie!

DETTAGLI: Unire due immagini mantenendo la trasparenza. Questo è quello che devo fare.

Nota: questo Set BufferedImage alpha mask in Java non fa ciò di cui ho bisogno perché non gestisce bene le due immagini con trasparenza: modifica la trasparenza della prima immagine.

risposta

155

Basta creare una nuova immagine con trasparenza con trasparenza, quindi dipingere le altre due immagini (con o senza semi-trasparenza) su di essa. questo è come sarà simile:

Image plus overlay

codice di esempio (le immagini sono chiamati 'immagine.png' e '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")); 
+0

Non c'è modo di avere il secondo immagine al centro del primo? – Ahmed

+3

Non dovresti invocare g.dispose(); alla fine? –

+0

Ciao, ho seguito questo approccio e salvato solo la seconda immagine ma non la prima immagine ... Qualsiasi aiuto qui sarebbe apprezzato .. –

2

Non riesco a darti una risposta specifica, ma java.awt.AlphaComposite qui è tuo amico. Avrai il controllo assoluto su come vuoi unire le due immagini. Tuttavia non è semplice da usare - è necessario prima imparare un po 'di teoria della grafica.

2

Senza saperne di più sull'effetto che si sta tentando di ottenere, farò semplicemente notare che è anche possibile disegnare a destra su BufferedImage. Quindi tutto ciò che potresti fare sullo schermo puoi farlo direttamente sull'immagine stessa.

Quindi, se tutto ciò che si desidera è disegnato sopra l'altro, è davvero facile. Basta prendere l'oggetto Graphics per l'immagine di base e disegnare l'altro su di esso.

Anche in questo caso, a seconda dell'effetto esatto che si sta verificando potrebbe non funzionare. Maggiori dettagli consentirebbero un aiuto migliore. Ad esempio, si tratta di un lavoro per AlphaComposite come menziona l'altro risponditore o un ImageOp personalizzato (o una combinazione di ImageOps esistenti).