29 // 7) 通过mirrorTransform.scale(-1.0, 1.0)的技巧翻转图片(水平翻转)
30 new AffineTransformOp(mirrorTransform, AffineTransformOp.TYPE_BILINEAR),
31 // 8) 通过rotate变换方式翻转,这里的180度翻转只是一个特例,为了便于演示,
32 // 事实上可以翻转任意角度, AnchorPoint表示翻转是的作用点(圆心),该坐标是
33 // 相对于该图像的左上角的偏移值。
34 new AffineTransformOp(AffineTransform.getRotateInstance(Math.PI,WINDOW_WIDTH/8,WINDOW_HEIGHT/4),
35 AffineTransformOp.TYPE_NEAREST_NEIGHBOR)
36 };
37 public MyTest() {
38 try {
39 image = ImageIO.read(new File("D:/desktop.png"));
40 //这里做一个源图像截取,便于后面的规范化显示。
41 image = image.getSubimage(0, 0,WINDOW_WIDTH/4, WINDOW_HEIGHT/2);
42 } catch (IOException e) {
43 }
44 }
45 @Override
46 public Dimension getPreferredSize() {
47 return new Dimension(WINDOW_WIDTH,WINDOW_HEIGHT);
48 }
49 public void paintComponent(Graphics g) {
50 super.paintComponent(g);
51 BufferedImage bimage = new BufferedImage(image.getWidth(), image.getHeight()
52 , BufferedImage.TYPE_INT_RGB);
53 Graphics2D ig = bimage.createGraphics();
54 ig.drawImage(image, 0, 0, null);
55 for (int i = 0; i < filters.length; i++) {
56 // 如果filters[i]的值是null,需要copy源图像,否则使用图像处理器处理图像。
57 if (filters[i] == null)
58 g.drawImage(bimage, 0, 0, null);
59 else
60 g.drawImage(filters[i].filter(bimage, null), 0, 0, null);
61 //平行移动
62 g.translate(WINDOW_WIDTH / 4, 0);
63 //向下移动,同时将x的坐标移回0的位置,由于translate和Graphics中
64 //之前的坐标变换是组合的,所以这里只能用这种方法偏移,而不能直接置零
65 if ((i + 1) % 4 == 0 && i != 0)
66 g.translate(-WINDOW_WIDTH, WINDOW_HEIGHT / 2);
67 }
68 ig.dispose();
69 }
70 public static void main(String[] args) {
71 JFrame frame = new JFrame();
72 frame.setTitle("BufferedImageOp");
73 frame.addWindowListener(new WindowAdapter() {
74 public void windowClosing(WindowEvent e) {
75 System.exit(0);
76 }
77 });
78 frame.setContentPane(new MyTest());
79 frame.pack();
80 frame.setVisible(true);
81 }
82 }