Como sobrepor uma imagem com outra e manter a trasparência

Galera, será que alguem poderia me ajudar?

Estou tendo problemas com trasparencia de imagens. É o seguinte:

Tenho uma imagem1 e preciso sobrepor outra imagem2 menor sobre esta imagem1. A imagem2 é png com trasparencia. Quero criar uma imagem com marca d’agua, que seria a imagem2 transparente em cima na imagem1.

Qndo eu abro a imagem2 que tem a trasparencia e jogo ela num JFrame só pra visualizar, ela abre com transparencia. Mas qndo eu uso o metodo getRGB de um objeto BufferImage pra pegar os pixels da imagem2 e uso o metodo setRGB pra sobrepor na imagem1, a imagem2 perde a transparencia e fica com o fundo branco. Eis o codigo:

public class Teste {

public static void main(String[] args) throws IOException {

     BufferedImage image = ImageIO.read(new File("c:/images.jpg"));
 BufferedImage image2 = ImageIO.read(new                                                                    File("c:/images2.png"));
 int w = image2.getWidth();
 int h = image2.getHeight();
 int[] pixels = image2.getRGB(0, 0, w, h, null, 0, w);
 
 image2.setRGB(0, 0, w, h, pixels ,0 ,w);

    // aqui vai o codigo pra mostrar no JFrame

}
}

Por favor, será que alguem poderia me dizer o que estou fazendo de errado? Percebi que este codigo esta perdendo o alpha da imagem2. Como eu faria pra fazer isso sem perder o alpha da imagem?

Obrigado.

Tente:

   BufferedImage image = ImageIO.read(new File("c:/images.jpg")); 
   BufferedImage image2 = ImageIO.read(new File("c:/logo.png")); 

   int w = image2.getWidth(); 
  int h = image2.getHeight(); 

   Graphics2D graphics = image.createGraphics();
   graphics.drawImage(image2, 0, 0, w, h, null);
   graphics.dispose();
   // aqui vai o codigo pra mostrar no JFrame 
} 

O problema é que o setPixel vai usar o padrão da imagem que está recebendo o pixel, de maneira direta, sem interpretar o contexto gráfico da imagem de origem. Isso não acontece se você usar o objeto graphics.

Nassa Vinicius…vlw mesmo…vc é um gênio cara!!!

Obrigadão pela força!!!

hahahaha… quem me dera ser um gênio.

A dica básica é: Sempre que possível, use o objeto Graphics para editar a imagem. Além de ser muuuito mais fácil, ele leva em consideração o tipo da imagem sendo editada. :wink:

Vinicius,
sem quere abusar da sua boa vontade, será q vc poderia me dar mais uma forcinha???

Preciso fazer a mesma coisa com 2 imagens GIFs, só que a imagem que fica por baixo, é um GIF animado. Fiz com GIFs normais e deu certo, mas com uma GIF animado não. A GIF perde a animação.

Será que teria coma fazer a mesma coisa sem perder a animação??

Mais uma vez, muito obrigado!!!

Ok, com GIF a coisa complica um pouco.

O GIF animado não é uma imagem só, e sim um conjunto de imagens, que são exibidas em seqüência. Primeiramente, você deve ler cada uma dessas imagens, usando um ImageInputStream e um ImageReader.

Depois, você aplica a marca d’agua em cada imagem, e salva tudo novamente com um ImageWriter.

Dá uma olhada nos tópicos:
http://java.sun.com/j2se/1.5.0/docs/guide/imageio/spec/apps.fm3.html
http://java.sun.com/j2se/1.5.0/docs/guide/imageio/spec/apps.fm4.html

Pow…legal…vou dar uma estudada nessas classes.

Eu preciso ver se tem como eu abrir um GIF animado ja com todas as imagens e depois trata-las, pq o parceiro que fornece as imagens, ja fornece desta maneira, não tem como eu abrir uma de cada vez.

Mas vlw cara…vou dar uma ralada aqui e qualquer coisa dou um berro…rsrs

Obrigadão!!!

Você não entendeu.

O formato GIF animado é composto por várias imagens. Independente de ser um arquivo só, o imageReader irá separa-las e o ImageWriter vai uni-las novamente.

Você vai ver que o ImageReader tem o método read(int) que recebe um índice de qual imagem dentro do arquivo .gif você quer abrir. É o que descreve o item 3.3.3 Reading From Multi-Image Files desse artigo que eu te passei.

Esse arquivo foi retirado dos exemplos do livro Core Java 2 - Advanced Features, sétima edição.

Ele mostra como abrir um gif animado. Note que o exemplo irá separar o gif (mesmo o de seu fornecedor) em várias imagens.

Bom proveito!

[quote=ViniGodoy]Tente:

   BufferedImage image = ImageIO.read(new File("c:/images.jpg")); 
   BufferedImage image2 = ImageIO.read(new File("c:/logo.png")); 

   int w = image2.getWidth(); 
  int h = image2.getHeight(); 

   Graphics2D graphics = image.createGraphics();
   graphics.drawImage(image2, 0, 0, w, h, null);
   graphics.dispose();
   // aqui vai o codigo pra mostrar no JFrame 
} 

O problema é que o setPixel vai usar o padrão da imagem que está recebendo o pixel, de maneira direta, sem interpretar o contexto gráfico da imagem de origem. Isso não acontece se você usar o objeto graphics.[/quote]

Encima era isso mesmo que eu estava procurando perfeito

Mesmo sendo um tópico antigo me ajudou muuuuuuuito!

E eu gostaria de acrescentar mais uma questão, como faço para escolher o canto onde vai ficar o logo? dessa maneira está fixando sempre no lado esquerdo superior.

Obrigado e abraços!