2012-08-20 26 views
6

Estoy creando una interfaz de usuario usando Swing y quiero mostrar una imagen en un JLabel. El código que uso es el siguiente:Toolkit.getDefaultToolkit(). CreateImage() vs ImageIO.read()

JLabel label = new JLabel(new ImageIcon(ImageIO.read(new File("img.jpg")))); 

Esto funciona bien si uso png imágenes, pero cuando se trata de jpg (sólo algunos de ellos), me sale una imagen rojizo (uno diferente que el que veo en Paint.NET). La imagen que utilicé es éste: img.jpg

así que he intentado (como alternativa):

Toolkit.getDefaultToolkit().createImage(new File("img.jpg").getAbsolutePath()); 
  1. ¿Alguien tiene una idea de por qué sucede esto? ¿Es un formato especial JPEG que no es compatible?
  2. He leído en este foro que la mayoría de la gente recomienda utilizar ImageIO (here por ejemplo). ¿Por qué?

Muchas gracias

+1

¿Funcionó la alternativa? – ShiDoiSi

+2

Sí lo hace. Es por eso que me pregunto por qué la gente lo recomienda de la otra manera ... –

+1

Espera, no puedo encontrar 'createImage (File f)' en los documentos Java de Toolkit ... ¿seguro? – ShiDoiSi

Respuesta

7

Según lo discutido here, su imagen JPEG puede contener información de transparencia falsa. Un recurso sencillo es renderizar la imagen en un buffer que tenga un modelo de color compatible, como se muestra en here.

+1

Ver también ['createCompatibleImage()'] (http://docs.oracle.com/javase/6/docs/api/ java/awt/GraphicsConfiguration.html). – trashgod

5

Parece que ha encontrado un fallo en ImageIO.read ... (puedo reproducir el tinte rojo, y que sin duda no es la forma que debe ser similar).

Usted puede tratar de

  • guardar los archivos JPEG con otros ajustes
  • abierta/volver a guardar el archivo con otros programas (con la esperanza de conseguir un JPEG-codificación más común)
  • o uso el método Toolkit (si no controlas las imágenes).

El único problema con el método Toolkit es que el método getImage() vuelve inmediatamente después de que se invoca y se carga en una cadena de fondo, por lo que no puede comenzar a trabajar con el objeto Image inmediatamente.

Cuestiones relacionadas