2012-10-05 2 views
1

Graphics.drawImage() 방법에는 ImageObserver 능력이 있습니다. 이것을 실제로 보는 가장 쉬운 방법은 무엇입니까? 나는 ImageIO.read()BufferedImage을 반환하므로 모두 메모리에 있다고 생각합니다. 관찰자가 호출하도록 부분적으로로드 된 이미지를 얻는 방법?이미지를 점진적으로로드하여 ImageObserver가 작동하는 방법?

+0

시도, [Toolkit.getImage] 같은 (http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html # getImage % 28java.net.URL % 29) 도움이 될 수 있습니다. – MadProgrammer

답변

3

이것은 이미지 관찰자를 말하는 것 같습니다. drawImage 메소드를 호출 중이며 이미지가 계속 처리중인 경우 ImageObserver이 사용됩니다. 스케일링은 이미지가 일반적으로 처리되도록하는 한 예입니다. `Image`을 반환하는 모든 방법을 사용하여

import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
import java.net.*; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ImageObserverDemo extends Box{ 

    Image bi; 
    Image bi2; 
    Dimension d = new Dimension(300,200); 

    public ImageObserverDemo() { 
     super(BoxLayout.Y_AXIS);   
     try { 
      bi = ImageIO.read(new URL("http://apod.nasa.gov/apod/image/0304/bluemarble2k_big.jpg")); 
      bi = bi.getScaledInstance(100, 100, BufferedImage.SCALE_SMOOTH); 
      bi2 = new BufferedImage(bi.getWidth(this), bi.getHeight(this), BufferedImage.TYPE_INT_ARGB); 
      bi2.getGraphics().drawImage(bi, 0, 0, this); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean imageUpdate(final Image img, int infoflags, int x, int y, 
      int width, int height) { 

     boolean result = true; 
     if((infoflags | ImageObserver.FRAMEBITS) == ImageObserver.FRAMEBITS){ 
      result = false; 
     } else if((infoflags | ImageObserver.ALLBITS) == ImageObserver.ALLBITS){ 
      result = false; 
     } 

     if(result){ 
      System.out.println("Image incomplete"); 
     } else{ 
      System.out.println("Complete"); 
     } 

     return result; 
    } 

    @Override 
    public Dimension getPreferredSize(){ 
     return d; 
    } 

    public static void main(String[] args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ImageObserverDemo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
관련 문제