영상 정보의 양이 많아 위와 같은 직접 표시 방식을 사용하는 경우, 파일에서 뒷부분을 읽지 않았기 때문에 앞부분이 표시되고 뒷부분이 표시될 수 있어 화면이 얼룩덜룩하게 나타나는 현상이 발생한다. 디스플레이 효과를 향상시키기 위해 많은 응용 프로그램에서는 이미지 버퍼링 기술을 사용합니다. 즉, 먼저 이미지를 메모리에 완전히 로드하고 버퍼에 이미지나 그래픽을 그린 다음 버퍼에 그려진 이미지나 그래픽을 화면에 출력합니다. 즉시. 버퍼링 기술은 깜박임 문제를 해결할 뿐만 아니라 이미지가 컴퓨터 메모리에서 생성되기 때문에 프로그램은 이미지에 대해 픽셀 수준 처리를 수행하고 이미지를 표시하기 전에 복잡한 이미지 변환을 완료할 수 있습니다.
[예제] 작은 응용 프로그램은 이미지 버퍼 디스플레이 기술을 시연합니다. 프로그램 실행 중 이미지 영역 내에서 마우스를 누르면 이미지에 테두리가 나타나며, 마우스를 움직이면 이미지도 그에 맞춰 움직입니다. 마우스를 떼면 테두리가 사라집니다. 프로그램은 먼저 두 가지 상태의 이미지를 두 개의 버퍼에 넣습니다. 마우스를 드래그하면 마우스를 누른 상태의 이미지가 새 위치에 계속해서 다시 그려집니다. .
import java.applet.*;import java.awt.*;imrt java.awt.image. * ;import javax.swing.*;import java.event.*;public 클래스 예제7_6 확장 Applet{ 이미지 myPicture; ) 메서드를 사용하려면 먼저 Image 개체를 정의하고 createImage() 메서드의 반환 값을 할당한 다음 Graphics 개체를 만들고 여기에 그래픽 환경을 할당합니다. 마지막으로 Graphics 객체가 drawImage() 메서드를 호출하여 이미지를 표시하도록 합니다. 여기서 그래픽 개체 offScreenGc는 화면이 아닌 개체이므로 애플릿 창에 이미지가 표시되지 않습니다*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG") Image offScreenImage = createImage (size() .width, size().height); 그래픽 offScreenGc = offScreenImage.getGraphics(); BufferedDemo(myPicture); } /*drawImage() 메소드의 네 번째 매개변수는 ImageObserver 인터페이스를 구현하는 것입니다. init() 메소드에서 drawImage() 메소드를 호출하기 위한 매개변수는 이것이기 때문에 애플릿은 imageUpdate를 정의해야 합니다. () 메소드*/ 공개 부울 imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // 이미지가 메모리에 완전히 로드되었음을 나타냅니다. repaint(); return false; // 스레드가 imageUpdate() 메서드를 다시 호출하지 못하도록 합니다.} else return true; 애플릿이 drawImage() 메서드를 호출하면 drawImage() 메서드는 imageUpdate() 메서드를 호출하는 스레드를 생성합니다. imageUpdate() 메서드에서는 이미지가 메모리에 부분적으로 전송되었는지 여부가 결정됩니다. 생성된 스레드는 메서드가 false를 반환할 때까지 imageUpdate() 메서드를 계속 호출합니다. infoFlg 매개변수를 사용하면 애플릿이 이미지가 메모리에 로드되는 방식을 알 수 있습니다. infoFlg가 ALLBITS와 같으면 이미지가 메모리에 완전히 로드되었음을 의미합니다. 이 메소드는 이미지가 메모리에 완전히 로드되었음을 확인하면 imageLoaded를 true로 설정하고 repaint() 메소드를 호출하여 애플릿 창을 다시 그립니다. 이 메서드는 스레드가 imageUpdate() 메서드를 다시 호출하는 것을 방지하기 위해 false를 반환합니다. */class BufferedDemo 확장 JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); setTile("이중 버퍼링 기술 데모"); setVisible(true) ; }} 클래스 PicPane은 JPanel을 확장하여 MouseListener, MouseMotionListener를 구현합니다{ int x = 0, y = 0, dx = 0, cy = 0; 부울 upstate = true; public picPanel(Image img){ this.addMouseListener(this); bimg1 = 새로운 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 g2D1 = bimg1.createGraphics(); 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); } 공공 무효 페인트구성요소(그래픽 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); () >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = false; setCursor(Cursor.getPre DefinedCursor(Coursor.HAND_CURSOR)) dx = e.getX() - x; y; repain(); } } 공개 void mouseExited(MouseEvent e){} 공개 void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void MouseReleased(MouseEvent e){ this.setCursor(Cursor.getpre DefinedCursor(Cursor.DEFAULT_CURSOR)) upState = true(MouseEvent e); ){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - dx; y = e.getY() - repaint();
버퍼 이미지를 생성하려면 프로그램은 java.awt.image 패키지에 BufferedImage 클래스를 도입해야 합니다. 버퍼 이미지를 생성하려면 Image 객체를 반환한 다음 이를 BufferedImage 객체로 변환하는 createImage() 메서드를 호출합니다. 예를 들어, 코드는 다음과 같습니다.
BufferedImage biimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
다음 구성 방법을 사용하여 만들 수도 있습니다.
BufferedImage(int 너비, int high, int imageType);
imageType 매개변수는 이미지 유형입니다.
버퍼를 사용하여 이미지를 표시하려면 먼저 버퍼에 이미지를 준비한 다음 버퍼에 있는 이미지를 인터페이스에 표시해야 합니다. 이미지를 표시하려면 다음 방법을 통해 생성할 수 있는 그래픽 객체가 필요합니다.
Graphics2D g2d = bimge.createGraphics();