Step By Step(Java 2D图形篇<二>) (八)

2014-11-24 03:21:37 · 作者: · 浏览: 19
void readByInputStream() throws IOException {

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 readers = ImageIO.getImageReadersBySuffix("gif");

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