25 InputStream bin = new BufferedInputStream(new FileInputStream("D:/desktop.png"));
26 image = ImageIO.read(bin);
27 bin.close();
28 }
29 public void paintComponent(Graphics g) {
30 super.paintComponent(g);
31 if (image == null)
32 return;
33 g.drawImage(image, 0, 0, null);
34 }
35 }
2) 通过ImageReader读取包含多幅图像的数据文件:
读取该类型的图像文件需要以下三个步骤:
2.1)将图形文件映射到图形输入流中(ImageInputStream),作为读取器的数据输入源;
2.2)根据图形文件的类型选择合适的ImageReader,由于图形数据的读取和解析;
2.3)将图形输入流绑定到ImageReader,并迭代读取出所有的图像数据到不同的BufferedImage。
这里我们需要制作出包含多幅图像的测试文件。
1 public class MyTest extends JPanel {
2 private BufferedImage[] images;
3 private int imageIndex = 0;
4 public static void main(String[] args) {
5 JFrame frame = new JFrame();
6 frame.setTitle("ImageReader");
7 frame.setSize(300, 400);
8 frame.addWindowListener(new WindowAdapter() {
9 public void windowClosing(WindowEvent e) {
10 System.exit(0);
11 }
12 });
13 Container contentPane = frame.getContentPane();
14 contentPane.add(new MyTest());
15 frame.show();
16 }
17 public MyTest() {
18 try {
19 loadImage();
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 }
24 private void loadImage() throws Exception {
25 String filename = "D:/desktop.gif";
26 // 1. 获取图形文件的输入流
27 FileInputStream inputStream = new FileInputStream(filename);
28 // 2. 基于文件输入流生成图形输入流作为ImageReader的数据源
29 ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStream);
30 // 3. 通过ImageIO的静态工厂方法获取指定类型图形文件的候选读取器集合的迭代器
31 Iterator
32 // 4. 一般而言,可以选择第一个读取器作为该类型图形文件的读取器。
33 ImageReader imageReader = readers.next();
34 // 5. 给ImageReader设定输入源,同时将第二个参数设定为false
35 //以便于后面获取Images的数量。
36 imageReader.setInput(imageInputStream, false);
37 // 6. 获取图像的数量。
38 // 参数说明:由于在某些图形文件的头部并没有给出该文件包含的图像数量,
39 // 因此如果该参数设置为false,该这种情况下函数将返回-1。如果参数为
40 // true呢?读取器将主动遍历整个图形文件并统计出图像的数量后返回。需要
41 // 注意的是,这样的操作可能会带来效率的开销。
42 int num = imageReader.getNumImages(true);
43 // 7. 利用读取器将图形数据从图形文件依次读取到BufferedImage。
44 images = new BufferedImage[num];
45 for (int i = 0; i < num; ++i)
46 images[i] = imageReader.read(i);
47 imageReader.dispose();
48 // 8. 这两个InputStream的close方法都是需要调用的,imageInputStream将会
49 //在close的时候关闭并删除其内部作为CacheFile的RandomAccessFile对象。
50 imageInputStream.close();
51 inputStream.close();
52 }
53 public void paintComponent(Graphics g) {
54 super.paintComponent(g);
55 if (images == null)
56