1
Graphics.drawImage()
方法有ImageObserver
能力。在行動中看到這個最簡單的方法是什麼?我猜ImageIO.read()
返回BufferedImage
所以它全部在內存中。如何獲取部分加載的圖像,以便觀察者可以調用?如何逐步加載Image以使ImageObserver正常工作?
Graphics.drawImage()
方法有ImageObserver
能力。在行動中看到這個最簡單的方法是什麼?我猜ImageIO.read()
返回BufferedImage
所以它全部在內存中。如何獲取部分加載的圖像,以便觀察者可以調用?如何逐步加載Image以使ImageObserver正常工作?
這似乎稱爲圖像觀察者。如果您打電話給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);
}
}
嘗試使用返回一個'Image'任何方法,像[Toolkit.getImage](http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html #getImage%28java.net.URL%29)可能會有所幫助 – MadProgrammer