Quando a quantidade de informações da imagem é grande e o método de exibição direta acima é usado, a parte frontal pode ser exibida e a última parte pode ser exibida, porque a última parte não foi lida do arquivo, fazendo com que a exibição pareça manchada. Para melhorar o efeito de exibição, muitos aplicativos usam tecnologia de buffer de imagem, ou seja, primeiro carregam a imagem completamente na memória, desenham a imagem ou os gráficos no buffer e, em seguida, exibem a imagem ou os gráficos desenhados no buffer na tela de uma vez. A tecnologia de buffer não apenas resolve o problema de oscilação, mas como a imagem é criada na memória do computador, o programa pode realizar processamento em nível de pixel na imagem e concluir transformações complexas da imagem antes de exibi-la.
[Exemplo] Um pequeno programa aplicativo demonstra tecnologia de exibição de buffer de imagem. Quando o programa está em execução, quando o mouse é pressionado dentro da área da imagem, uma borda aparecerá na imagem e, quando o mouse for movido, a imagem se moverá de acordo. Após levantar o mouse, a borda desaparece. O programa primeiro coloca as imagens nos dois estados em dois buffers. Quando o mouse é arrastado, a imagem com o estilo do mouse para baixo é redesenhada continuamente na nova posição. Quando o mouse é levantado, a imagem com o estilo do mouse para cima é redesenhada. .
importar java.applet.*;importar java.awt.*;importar java.awt.image. * ;importar javax.swing.*;importar java.event.*;classe pública Exemplo7_6 estende o miniaplicativo{ Imagem minhaImagem /*init(; ), primeiro defina um objeto Image e atribua o valor de retorno do método createImage(), depois crie um objeto Graphics e atribua a ele um ambiente gráfico. Finalmente, deixe o objeto Graphics chamar o método drawImage() para exibir a imagem. Como o objeto Graphics offScreenGc aqui é um objeto que não é de tela, não haverá imagem exibida na janela do miniaplicativo*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG"); (size() .width, size().height); Gráficos offScreenGc = offScreenImage.getGraphics(); BufferedDemo(myPicture); } /*O quarto parâmetro do método drawImage() é implementar a interface ImageObserver. No método init(), o parâmetro para chamar o método drawImage() é este, portanto o applet deve definir o imageUpdate. () método*/ public boolean imageUpdate(Imagem img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // Indica que a imagem foi totalmente carregada na memória repaint(); return false; // Impede que o thread chame o método imageUpdate() novamente} else return true }}/*O processo de execução do programa é quando o applet chama o método drawImage(), o método drawImage() criará um thread que chama o método imageUpdate(). No método imageUpdate(), é determinado se a imagem foi parcialmente transferida para a memória. O thread criado continua chamando o método imageUpdate() até que o método retorne falso. O parâmetro infoFlg permite que o applet saiba como a imagem é carregada na memória. Quando infoFlg é igual a ALLBITS, significa que a imagem foi totalmente carregada na memória. Quando este método descobre que a imagem foi completamente carregada na memória, ele define imageLoaded como true e chama o método repaint() para redesenhar a janela do miniaplicativo. O método retorna false para evitar que o thread chame o método imageUpdate() novamente. */class BufferedDemo estende JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); ; }}classe PicPane estende JPanel implementa MouseListener, MouseMotionListener{ int x = 0, y = 0, dx = 0, cy = 0; BufferedImage bimg1, bimg2; boolean upstate = true; public picPanel (Imagem img){ this.setBackground (Color.white); bimg1 = novo BufferedImage(img.getWidth(isto), img.getHeight(este), BufferedImage.TYPE_INT_ARGB); bimg2 = new BufferedImage(img.getWidth(este), img.getHeight(este), BufferedImage.TYPE_INT_ARGB); criarGráficos(); g2D1.drawImage(img, 0, 0, este); g2D2.drawImage(img, 0, 0, este); g2D2.drawRect(1, 1, img.getWidth(este) - 3, img.getHeight(este) - 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, this); () >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = 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.getpredefinedCursor(Cursor.DEFAULT_CURSOR)); ){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - dx; y = e.getY() - dy;
Para criar uma imagem buffer, o programa precisa introduzir a classe BufferedImage no pacote java.awt.image. Para criar uma imagem buffer, chame o método createImage(), que retorna um objeto Image e o converte em um objeto BufferedImage. Por exemplo, código:
BufferedImage biimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
Você também pode usar os seguintes métodos de construção para criá-lo.
BufferedImage(int largura,int alta, int imageType);
O parâmetro imageType é o tipo de imagem.
Para usar um buffer para exibir uma imagem, você precisa primeiro preparar a imagem no buffer e, em seguida, exibir a imagem no buffer na interface. A exibição de imagens requer objetos gráficos, que podem ser criados através dos seguintes métodos:
Gráficos2D g2d = bimge.createGraphics();