2012-07-03 20 views
5

Soy nuevo en los gráficos Java (gráficos de computadora en general) y Stack Overflow, así que por favor ayúdenme y ayúdenme a expresar mejor mi problema.BufferedImage no se muestra (todo en negro) pero la imagen se puede mostrar

Por el momento, estoy tratando de mostrar una Imagen Buffered junto a la imagen original en una GUI de Java. Este es mi código:

Image oriImage = robot.getQwerkController().getVideoStreamService().getFrame(); //load the original image 
Graphics2D hi = bufferedImage.createGraphics(); 
hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
hi.dispose(); 
images[0].put(oriImage, 1); //draws the original image in the first frame 
images[1].put(bufferedImage, 2); //draws the BufferedImage in the second frame 

y el "puesto" función es la siguiente:

public synchronized void put(Image image, int frameNumber) { 
    icon.setImage(image); //sets the image displayed by this icon 
    display.paintImageIcon(icon, frameNumber); //paint the image onto the gui 
    imageSet = true; 
    notifyAll(); 
} 

Sin embargo, la interfaz gráfica resultante es la siguiente

enter image description here

Así que los trabajos de imagen , pero BufferedImage no. Supongo que funciona porque BufferedImage es una subclase de Image ... ¿Alguna idea? Por favor, hágamelo saber si se necesita código adicional ~ Gracias de antemano :)

EDIT 1:

Hice algunas pruebas, y en lugar de utilizar la imagen original, que creó toda una nueva BufferedImage, y se utiliza para Graphics2D dibuja una línea y luego intenta mostrarla. aquí está el resultado:

http://i.imgur.com/rJAdp.jpg

por lo que funciona. Por lo tanto, debe haber algo mal con la imagen original (o la conversión que sucedió)

EDIT 2: Hice una cosa similar con bufferDamage y trazó una línea. El resultado es el mismo que EDIT 1, y por lo tanto, creo que hay algún problema con la función drawImage.

EDIT 3: Resolví el problema poniendo un bucle while en el drawImage para completar el dibujo de la imagen (porque devuelve false si aún no ha terminado de dibujar una imagen) y funcionó. : D

boolean x = false; 
while (!x) { 
    x = hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
} 
+2

¿Puedes por favor publicar el código de cómo creaste inicialmente el objeto 'bufferedImage'. – cgull

+0

'// carga la imagen original' Sincrónicamente (espera hasta que cargue la imagen) o asincrónicamente (el código continúa mientras se carga la imagen)? Para una mejor ayuda antes, publique un [SSCCE] (http://sscce.org/). –

+0

Lo haría si pudiera publicar un SSCCE, el problema es que todo el proyecto es bastante grande y muchos de los códigos son irrelevantes para el problema. (La imagen que obtenemos ahora proviene de una cámara web que está cargada en un robot) Sin embargo, voy a editar para obtener más información. ¡Gracias! –

Respuesta

1

Usted debe ser capaz de lograr el mismo resultado si sólo pasa el ImageObserver (la instancia JFrame o JPanel en la que va a dibujar) en el método drawImage en lugar de null. Esto se encargará de la carga de imágenes asíncronas por usted.

+0

genial Lo intentaré también. Gracias –

0

Lo siento, pero supongo que está utilizando pintura inmediata (push). En general, java lo hace al revés (pull).

Java swing/awt draws evento conducido: uno no dibuja una imagen inmediatamente, pero uno podría desencadenarlo por una invalidación o volver a pintar. Puede iniciar un temporizador de oscilación con su velocidad de cuadros y llamar allí repintar().

En general, un hijo de JPanel puede anular paintComponent(Graphics g) y dibujar en g.

Sin embargo, es extraño. Puede probar el registro oriImage.getHeight(null), para ver (improbable) si la imagen se produce de manera sincronizada (altura -1 al comienzo).

+0

Yeap Me di cuenta de esto después de mirar la documentación del código. –

Cuestiones relacionadas