2012-10-05 20 views
1

Graphics.drawImage()方法有ImageObserver能力。在行動中看到這個最簡單的方法是什麼?我猜ImageIO.read()返回BufferedImage所以它全部在內存中。如何獲取部分加載的圖像,以便觀察者可以調用?如何逐步加載Image以使ImageObserver正常工作?

+0

嘗試使用返回一個'Image'任何方法,像[Toolkit.getImage](http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html #getImage%28java.net.URL%29)可能會有所幫助 – MadProgrammer

回答

3

這似乎稱爲圖像觀察者。如果您打電話給drawImage方法並且圖像仍在處理中,它將開始使用ImageObserver。縮放是一個會導致圖像一般處理的例子。

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); 
    } 

}