Cuando la cantidad de información de la imagen es grande y se utiliza el método de visualización directa anterior, es posible que se muestre la parte frontal y la última parte, porque la última parte no se ha leído del archivo, lo que hace que la pantalla aparezca moteada. Para mejorar el efecto de visualización, muchas aplicaciones utilizan tecnología de almacenamiento en búfer de imágenes, es decir, primero carga la imagen completamente en la memoria, dibuja la imagen o los gráficos en el búfer y luego genera la imagen o los gráficos dibujados en el búfer en la pantalla. inmediatamente. La tecnología de almacenamiento en búfer no solo resuelve el problema del parpadeo, sino que debido a que la imagen se crea en la memoria de la computadora, el programa puede realizar un procesamiento a nivel de píxeles en la imagen y completar transformaciones complejas de la imagen antes de mostrarla.
[Ejemplo] Un pequeño programa de aplicación demuestra la tecnología de visualización del búfer de imágenes. Cuando el programa se está ejecutando, cuando se presiona el mouse dentro del área de la imagen, aparecerá un borde en la imagen y cuando se mueve el mouse, la imagen se moverá en consecuencia. Después de levantar el mouse, el borde desaparece. El programa primero coloca las imágenes en los dos estados en dos buffers. Cuando se arrastra el mouse, la imagen con el estilo del mouse hacia abajo se vuelve a dibujar continuamente en la nueva posición. Cuando se levanta el mouse, la imagen con el estilo del mouse hacia arriba se vuelve a dibujar. .
importar java.applet.*;importar java.awt.*;importar java.awt.image. * ;importar javax.swing.*;importar java.event.*;clase pública Ejemplo7_6 extiende Applet{ Imagen miImagen /*init( ), primero defina un objeto Imagen y asigne el valor de retorno del método createImage(), luego cree un objeto Gráficos y asígnele un entorno gráfico. Finalmente, deje que el objeto Graphics llame al método drawImage() para mostrar la imagen. Dado que el objeto Gráficos offScreenGc aquí es un objeto que no es de pantalla, no se mostrará ninguna imagen en la ventana del subprograma*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG"); (tamaño() .ancho, tamaño().alto); Gráficos offScreenGc = offScreenImage.getGraphics(); BufferedDemo(myPicture); } /* El cuarto parámetro del método drawImage() es implementar la interfaz ImageObserver. En el método init(), el parámetro para llamar al método drawImage() es este, por lo que el subprograma debe definir imageUpdate. () método*/ imageUpdate booleano público(Image img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // Indica que la imagen se ha cargado completamente en la memoria repaint(); return false; // Evita que el hilo vuelva a llamar al método imageUpdate()} else return true }}/*El proceso de ejecución del programa es cuando el subprograma llama al método drawImage(), el método drawImage() creará un hilo que llama al método imageUpdate(). En el método imageUpdate(), se determina si la imagen se ha transferido parcialmente a la memoria. El hilo creado sigue llamando al método imageUpdate() hasta que el método devuelve falso. El parámetro infoFlg permite al subprograma saber cómo se carga la imagen en la memoria. Cuando infoFlg es igual a ALLBITS, significa que la imagen se ha cargado completamente en la memoria. Cuando este método descubre que la imagen se ha cargado completamente en la memoria, establece imageLoaded en verdadero y llama al método repaint() para volver a dibujar la ventana del subprograma. El método devuelve falso para evitar que el hilo vuelva a llamar al método imageUpdate(). */class BufferedDemo extiende JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); setTile("Demostración de tecnología de doble buffer"); }}clase PicPane extiende JPanel implementa MouseListener, MouseMotionListener{ int x = 0, y = 0, dx = 0, cy = 0; BufferedImage bimg1, bimg2; boolean upstate = true; picPanel público(Image img){ this.setBackground(Color.white); bimg1 = nueva Imagen Buffered(img.getWidth(esto), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); crearGráficos(); g2D1.drawImage(img, 0, 0, esto); g2D2.drawImage(img, 0, 0, esto); g2D2.drawRect(1, 1, img.getWidth(esto) - 3, img.getHeight(esto) - 3); } public void paintComponent(Gráficos g){ super.painComponent(g); (Graphics2D)g; if (upState) g2D.drawImage(bimg1, x, y, this); else g2D.drawImage(bimg2.x, y, this } public void mousePress(MouseEvent e){ if (e.getX); () >= x && e.getX() < x + bimg1.getWidth(este) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = false; setCursor(Cursor.getPredefinidoCursor(Coursor.HAND_CURSOR)); y; repain(); } } public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent) e){} public void mouseEntered(MouseEvent e){} public void MouseReleased(MouseEvent e){ this.setCursor(Cursor.getpredefinidoCursor(Cursor.DEFAULT_CURSOR)); upState = true; ){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - dx; y = e.getY() - repintar();
Para crear una imagen de búfer, el programa necesita introducir la clase BufferedImage en el paquete java.awt.image. Para crear una imagen de búfer, llame al método createImage(), que devuelve un objeto Imagen y luego lo convierte en un objeto BufferedImage. Por ejemplo, código:
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
También puede utilizar los siguientes métodos de construcción para crearlo.
BufferedImage(int ancho,int alto, int tipoimagen);
El parámetro imageType es el tipo de imagen.
Para usar un búfer para mostrar una imagen, primero debe preparar la imagen en el búfer y luego mostrar la imagen en el búfer en la interfaz. La visualización de imágenes requiere objetos gráficos, que se pueden crear mediante los siguientes métodos:
Graphics2D g2d = bimge.createGraphics();