SoloCodigo

Programación General => Java => Mensaje iniciado por: AURED en Martes 14 de Noviembre de 2006, 18:14

Título: Superponer Dos Imágenes
Publicado por: AURED en Martes 14 de Noviembre de 2006, 18:14
Hola a todos,

Hace una infinidad de tiempo que no pasaba por este foro.

Tengo una duda:

¿es posible superponer dos imágenes en JAVA?

Me explico tengo una imagen que quiero que funcione como fondo y a la que colocarle una imagen transparente de modo que se superpongan ambas imágenes. En concreto se trata de un mapa al que quiero colocarle símbolos meteorológicos. Tengo el mapa por un lado y la imagen con los símbolos por otro.

¿Como se podría hacer? si alguien puede darme alguna indicación acerca de que clase o clases utilizar o de donde podría recoger información se lo agradecería.

Saludos
Título: Re: Superponer Dos Imágenes
Publicado por: silverfox en Miércoles 15 de Noviembre de 2006, 09:22
Hola...


Claro que se puede.

Echa un vistazo a la clase BufferedImage. Necesitarás una imágen que tenga canal alpha (transparencia), o bien, ponerla tú a mano.

De todas formas... si te fijas en los mapas del tiempo, los signos que aparecen no son transparentes.




Un saludo.




Silverfox
Título: Re: Superponer Dos Imágenes
Publicado por: AURED en Miércoles 29 de Noviembre de 2006, 10:51
Ya conseguí superponer dos imágenes pero no funciona muy bien que digamos. Me explico:

Tengo un boton que me dibuja la imagen (con las dos superpuestas). El fondo lo selecciono con un JComboBox y la imagen que se dibuja encima del fondo se selecciona (todo esto lo hago previamente a dibujar la imagen). El código que tengo es algo así:

Código: Text
  1.  
  2. public void pintar(){
  3.       bufIm=new BufferedImage(600,600,BufferedImage.TYPE_INT_ARGB);
  4.     Graphics2D gbi = bufIm.createGraphics();
  5.     gbi.drawImage(fondo,0,0,null);
  6.     AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
  7.     gbi.setComposite(ac);
  8.       gbi.drawImage(capa,0,0,null);
  9.       ImageIcon ic=new ImageIcon(bufIm);
  10.       muestra.setIcon(ic);
  11.     }
  12.     private void cambiarFondo(){
  13.       fondo=Toolkit.getDefaultToolkit().getImage(regiones.getSelectedItem()+".jpg");  
  14.     }
  15.     private void cargarDatos(){
  16.       FileDialog fd=new FileDialog(this);
  17.     fd.setTitle("Seleccionar imagen a cargar");
  18.     fd.show();
  19.     if(fd.getFile()!=null){
  20.       String origen=fd.getDirectory()+fd.getFile();
  21.       capa=Toolkit.getDefaultToolkit().getImage(origen);
  22.     }
  23.     }
  24.  

El botón es el encargado de llamar al método pintar() una vez el fondo y la capa superficial han sido seleccionados. El problema es que necesito hacer dos clicks al botón para que me dibuje la imagen actualizada. A la primera no la dibuja. ¿Tenéis alguna idea de por qué es esto así?
Título: Re: Superponer Dos Imágenes
Publicado por: AURED en Miércoles 29 de Noviembre de 2006, 12:35
¿Es posible que la imagen no se haya cargado?¿Debo emplear un MediaTracker?
Título: Re: Superponer Dos Imágenes
Publicado por: silverfox en Viernes 1 de Diciembre de 2006, 07:56
Hola...

Puede deberse a que la imágen no ha terminado de cargarse, o también puede deberse a que no se refresca apropiadamente el componente cuando la pintas.

Para solucionarlo, trata de usar las clases de observación de imágenes a ver si es la primera, y reliza un update para ver si es la segunda.

Espero que lo soluciones.



Un saludo.



Silverfox
Título: Re: Superponer Dos Imágenes
Publicado por: AURED en Viernes 1 de Diciembre de 2006, 11:01
Solucionado.

Empleando el MediaTracker funciona perfectamente.

El código queda algo así, lo cuelgo por si a alguien le pudiese ser de utilidad.

Código: Text
  1. public void pintar(){
  2.       bufIm=new BufferedImage(600,600,BufferedImage.TYPE_INT_ARGB);
  3.     Graphics2D gbi = bufIm.createGraphics();
  4.     gbi.drawImage(fondo,0,0,null);
  5.     AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
  6.     gbi.setComposite(ac);
  7.       gbi.drawImage(capa,0,0,null);
  8.       ImageIcon ic=new ImageIcon(bufIm);
  9.       muestra.setIcon(ic);
  10.     }
  11.     private void cambiarFondo(){
  12.       fondo=Toolkit.getDefaultToolkit().getImage(regiones.getSelectedItem()+".jpg");
  13.       MediaTracker tracker=new MediaTracker(this);
  14.       tracker.addImage(fondo,1);
  15.       try{
  16.         if(!tracker.waitForID(1,10000)){
  17.           System.out.println("Load error.");
  18.             System.exit(1);
  19.         }
  20.       }catch(Exception e){
  21.         e.printStackTrace();
  22.         System.exit(1);
  23.       }
  24.       if((tracker.statusAll(false)&MediaTracker.ERRORED& MediaTracker.ABORTED) != 0){
  25.           System.out.println("Load errored or aborted");
  26.           System.exit(1);
  27.       }  
  28.     }
  29.     private void cargarDatos(){
  30.       FileDialog fd=new FileDialog(this);
  31.     fd.setTitle("Seleccionar imagen a cargar");
  32.     fd.show();
  33.     if(fd.getFile()!=null){
  34.       String origen=fd.getDirectory()+fd.getFile();
  35.       capa=Toolkit.getDefaultToolkit().getImage(origen);
  36.       MediaTracker tracker=new MediaTracker(this);
  37.         tracker.addImage(capa,1);
  38.       try{
  39.           if(!tracker.waitForID(1,10000)){
  40.             System.out.println("Load error.");
  41.               System.exit(1);
  42.           }
  43.         }catch(Exception e){
  44.           e.printStackTrace();
  45.           System.exit(1);
  46.         }
  47.         if((tracker.statusAll(false)&MediaTracker.ERRORED& MediaTracker.ABORTED) != 0){
  48.             System.out.println("Load errored or aborted");
  49.             System.exit(1);
  50.         }
  51.     }
  52.      
  53.     }
  54.