Wenn die Bildinformationsmenge groß ist und die obige Direktanzeigemethode verwendet wird, wird möglicherweise der vordere Teil und der hintere Teil angezeigt, da der letzte Teil nicht aus der Datei gelesen wurde, was dazu führt, dass die Anzeige fleckig erscheint. Um den Anzeigeeffekt zu verbessern, verwenden viele Anwendungen die Bildpuffertechnologie. Das heißt, sie laden das Bild zunächst vollständig in den Speicher, zeichnen das Bild oder die Grafik in den Puffer und geben dann das gezeichnete Bild oder die gezeichnete Grafik im Puffer auf dem Bildschirm aus auf einmal. Die Puffertechnologie löst nicht nur das Flimmerproblem, sondern da das Bild im Computerspeicher erstellt wird, kann das Programm eine Verarbeitung auf Pixelebene am Bild durchführen und komplexe Bildtransformationen durchführen, bevor es angezeigt wird.
[Beispiel] Ein kleines Anwendungsprogramm demonstriert die Bildpuffer-Anzeigetechnologie. Wenn das Programm ausgeführt wird und die Maus innerhalb des Bildbereichs gedrückt wird, erscheint ein Rand auf dem Bild, und wenn die Maus bewegt wird, bewegt sich das Bild entsprechend. Nach Anheben der Maus verschwindet der Rand. Das Programm legt die Bilder in den beiden Zuständen zunächst in zwei Puffern ab. Wenn die Maus gezogen wird, wird das Bild mit der Maus nach unten kontinuierlich an der neuen Position neu gezeichnet .
import java.applet.*;import java.awt.*;import java.awt.image * ;import javax.swing.*;import java.event.*;public class example7_6 erweitert Applet{ Image myPicture; )-Methode definieren Sie zunächst ein Image-Objekt und weisen den Rückgabewert der createImage()-Methode zu, erstellen dann ein Graphics-Objekt und weisen ihm eine Grafikumgebung zu. Lassen Sie abschließend das Graphics-Objekt die Methode drawImage() aufrufen, um das Bild anzuzeigen. Da das Grafikobjekt offScreenGc hier ein Nicht-Bildschirmobjekt ist, wird im Applet-Fenster kein Bild angezeigt*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG"); Image offScreenImage = createImage (size() .width, size().height); Graphics offScreenGc = offScreenImage.getGraphics(); BufferedDemo(myPicture); } /*Der vierte Parameter der drawImage()-Methode dient der Implementierung der ImageObserver-Schnittstelle. In der init()-Methode ist der Parameter zum Aufrufen der drawImage()-Methode dieser, daher muss das Applet das imageUpdate definieren () method*/ public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // Zeigt an, dass das Bild vollständig in den Speicher geladen wurde. repaint(); // Verhindere, dass der Thread die imageUpdate()-Methode erneut aufruft.} else return true; Das Applet ruft die Methode drawImage() auf, die Methode drawImage() erstellt einen Thread, der die Methode imageUpdate() aufruft. In der Methode imageUpdate() wird ermittelt, ob das Bild teilweise in den Speicher übertragen wurde. Der erstellte Thread ruft die Methode imageUpdate() so lange auf, bis die Methode „false“ zurückgibt. Der Parameter infoFlg ermöglicht es dem Applet zu wissen, wie das Bild in den Speicher geladen wird. Wenn infoFlg gleich ALLBITS ist, bedeutet dies, dass das Bild vollständig in den Speicher geladen wurde. Wenn diese Methode feststellt, dass das Bild vollständig in den Speicher geladen wurde, setzt sie imageLoaded auf true und ruft die repaint()-Methode auf, um das Applet-Fenster neu zu zeichnen. Die Methode gibt false zurück, um zu verhindern, dass der Thread die Methode imageUpdate() erneut aufruft. */class BufferedDemo erweitert JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); setTile("Double Buffering Technology Demonstration"); ; }}Klasse PicPane erweitert JPanel implementiert MouseListener, MouseMotionListener{ int x = 0, y = 0, dx = 0, cy = 0; BufferedImage bimg1, bimg2; boolean upstate = true; this.setBackground(This.addMouseListener(this); bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); Graphics2D g2D2 = bimg2. createGraphics(); g2D1.drawImage(img, 0, 0, this); g2D2.drawImage(img, 0, 0, this); g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3); } public void paintComponent(Graphics 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(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = false; setCursor(Cursor.getPredefinedCursor(Coursor.HAND_CURSOR)); dx = e.getX() - 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.getpredefinedCursor(Cursor.DEFAULT_CURSOR)); upState = true; ){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - dx; y = e.getY() - dy repaint();
Um ein Pufferbild zu erstellen, muss das Programm die Klasse BufferedImage im Paket java.awt.image einführen. Um ein Pufferbild zu erstellen, rufen Sie die Methode createImage() auf, die ein Image-Objekt zurückgibt und es dann in ein BufferedImage-Objekt konvertiert. Beispielcode:
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
Sie können zur Erstellung auch die folgenden Konstruktionsmethoden verwenden.
BufferedImage(int width,int high, int imageType);
Der Parameter imageType ist der Bildtyp.
Um einen Puffer zum Anzeigen eines Bildes zu verwenden, müssen Sie zuerst das Bild im Puffer vorbereiten und dann das Bild im Puffer auf der Schnittstelle anzeigen. Für die Anzeige von Bildern sind Grafikobjekte erforderlich, die mit den folgenden Methoden erstellt werden können:
Graphics2D g2d = bimge.createGraphics();