• Sábado 4 de Mayo de 2024, 11:32

Autor Tema:  Superponer Dos Imágenes  (Leído 5300 veces)

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Superponer Dos Imágenes
« en: Martes 14 de Noviembre de 2006, 18:14 »
0
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
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Superponer Dos Imágenes
« Respuesta #1 en: Miércoles 15 de Noviembre de 2006, 09:22 »
0
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

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Superponer Dos Imágenes
« Respuesta #2 en: Miércoles 29 de Noviembre de 2006, 10:51 »
0
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í?
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Superponer Dos Imágenes
« Respuesta #3 en: Miércoles 29 de Noviembre de 2006, 12:35 »
0
¿Es posible que la imagen no se haya cargado?¿Debo emplear un MediaTracker?
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Superponer Dos Imágenes
« Respuesta #4 en: Viernes 1 de Diciembre de 2006, 07:56 »
0
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

AURED

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Superponer Dos Imágenes
« Respuesta #5 en: Viernes 1 de Diciembre de 2006, 11:01 »
0
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.  
"Es mejor saber después de haber pensado y discutido que aceptar los saberes que nadie discute para no tener que pensar"