2010-02-23 25 views
72

Necesito unir dos imágenes (BufferedImage) en Java. No sería un problema si no hubiera transparencia. La imagen base ya tiene algo de transparencia. Quiero mantener esto como está y aplicarle una "máscara", la segunda imagen. Esta segunda imagen no tiene píxeles opacos, de hecho es casi completamente transparente, solo tiene algunos píxeles menos transparentes para dar algún tipo de "efecto de luz", como un reflejo. Detalles importantes: no quiero hacer esto en la pantalla, con gráficos. Necesito obtener una Imagen Buffered con la fusión resultante.Fusionando dos imágenes

¿Alguien me puede ayudar? Gracias!

DETALLES: Combina dos imágenes manteniendo la transparencia. Esto es lo que necesito hacer.

Nota: este Set BufferedImage alpha mask in Java no hace lo que necesito porque no funciona bien con las dos imágenes que tienen transparencia: modifica la transparencia de la primera imagen.

Respuesta

155

Simplemente cree una nueva Imagen Buffered con transparencia, luego pinte las otras dos imágenes (con total o semi-transparencia) en ella. Esta es la forma en que se verá así:

Image plus overlay

Código de la muestra (las imágenes se llaman 'image.png' y '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

¿Hay manera de tener el segundo imagen en el centro de la primera? – Ahmed

+3

¿No debería invocar g.dispose(); ¿al final? –

+0

Hola, seguí este enfoque y guardé solo la segunda imagen, pero no la primera imagen ... Cualquier ayuda aquí sería apreciada ... –

2

No puedo darle una respuesta específica, pero java.awt.AlphaComposite aquí es tu amigo. Obtendrá el control absoluto sobre cómo desea fusionar las dos imágenes. Sin embargo, no es fácil de usar, primero debe aprender un poco de teoría de gráficos.

2

Sin saber más sobre el efecto que está tratando de lograr, solo señalaré que también puede dibujar a la derecha en una Imagen Buffered. Entonces, cualquier cosa que pueda hacer en la pantalla lo puede hacer directamente sobre la imagen.

Así que si todo lo que quiere es uno dibujado sobre el otro, eso es realmente fácil. Simplemente toma el objeto Graphics para la imagen base y dibuja el otro en él.

De nuevo, dependiendo del efecto exacto que vaya, puede que no funcione. Más detalles permitirían una mejor ayuda. Por ejemplo, este es un trabajo para AlphaComposite como menciona el otro respondedor o un ImageOp personalizado (o alguna combinación de ImageOps existente).