Merge de imagem [Marca d'água]

E aí galera, td blza?

Alguém tem idéia de como eu posso fazer um merge de duas imagens, salvando uma delas sobre a outra, como se fosse uma marca d’água?

imagem1.jpg
|----------------------|
|----------------------|
|----------------------|
|----------------------|
|----------------------|
|----------------------|
|----------------------|

imagem2.jpg
|---|

imagem3.jpg (resultado)
|----------------------|
|----------------------|
|----------------------|
|----------------------|
|----------------------|
|----------------|---|-|
|----------------------|

estou quase com a biblioteca JAI, mas a marca dágua está ficando no canto superior esquerdo da imagem de fundo :cry: … vejam só:

		RenderedImage bg = JAI.create("fileload","c:\\temp\\background.jpg"); 
		RenderedImage fg = JAI.create("fileload","c:\\temp\\foreground.jpg");

		TiledImage ti =
		   new TiledImage(bg.getMinX(),
		                  bg.getMinY(),
		                  bg.getWidth(),
		                  bg.getHeight(),
		                  bg.getTileGridXOffset(),
		                  bg.getTileGridYOffset(),
		                  bg.getSampleModel(),
		                  bg.getColorModel());
		ti.set(bg);

		Rectangle r =
		    new Rectangle(fg.getMinX(),
		                  fg.getMinY(),
		                  fg.getWidth(),
		                  fg.getHeight());
		
		ROI roi = new ROIShape(r);		
		ti.setData(fg.getData(), roi);
		
		JAI.create("filestore",ti,"c:\\temp\\result.jpg","jpeg",null);

Será que não é por JPG não aceitar transparência??

Acho que deverias tentar com PNG, ou GIF…

[ ]'s…

isso eu sei, mas o problema está no posicionamento da imagem… ela deveria ficar no canto inferior e está ficando no superior

Galera, consegui fazer o merge das imagens, mas não consigo salvá-la, faço tudo que quero na imagem e obtenho um objeto do tipo Graphics2D, mas como salvar essa imagem em formato JPG?

Abaixo segue o código de testes que estou executando…


public class TransparentImage
extends JFrame {
	BufferedImage bi1;
	BufferedImage bi2;
	
	public static void main(String args[]) {
		TransparentImage ti = new TransparentImage( );
		ti.setSize(400, 400);
		ti.setVisible(true);
		ti.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	
	public TransparentImage( ) {
		Image image1 = Toolkit.getDefaultToolkit().getImage("c:\\temp\\logo.jpg");
		Image image2 = Toolkit.getDefaultToolkit().getImage("c:\\temp\\inverno.jpg");
		MediaTracker tracker = new MediaTracker(this);
		tracker.addImage(image1, 0);
		tracker.addImage(image2, 0);
		try { 
			tracker.waitForID(0); }
		catch (InterruptedException ie) {
			ie.printStackTrace( ); }
		
		bi1 = new BufferedImage(image1.getWidth(null), image1.getHeight(null), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = bi1.createGraphics( );
		g2.drawImage(image1, null, null);
		
		bi2 = new BufferedImage(image2.getWidth(null), image2.getHeight(null), BufferedImage.TYPE_INT_ARGB);
		g2 = bi2.createGraphics( );
		g2.drawImage(image2, null, null);
	}
	
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		
		Point2D center =  new Point2D.Float(this.getHeight( ) / 2, this.getWidth( ) / 2);
		AffineTransform at = AffineTransform.getTranslateInstance(center.getX( ) - (bi2.getWidth( ) / 2), center.getY( ) - (bi2.getHeight( ) / 2));
		
		g2.transform(at);
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.drawImage(bi2, 0, 0, null);
		
		/*AlphaComposite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .99f);
		g2.setComposite(c);*/
		
		at = AffineTransform.getTranslateInstance(center.getX( ) - (bi1.getWidth( ) / 2), center.getY( ) - (bi1.getHeight( ) / 2));
		g2.setTransform(at);
		g2.drawImage(bi1, 0, 0, null);

		Image img = this.createImage(this.getWidth(),this.getHeight());
		BufferedImage bi3 = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
		Graphics2D g3 = bi3.createGraphics();
		
		try {
			ImageIO.write(bi3,"jpg",new File("C:\\temp\\logo_.jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}