34 //如果源图像的ColorModel和当前设备的ColorModel兼容,则直接返回
35 if (image.getColorModel().equals(gc.getColorModel()))
36 return image;
37 //基于源图像创建和设备兼容的目标图像
38 BufferedImage compatibleImage = gc.createCompatibleImage(image.getWidth()
39 , image.getHeight(),image.getTransparency());
40 //再将源图像绘制到目标图像后返回
41 Graphics g = compatibleImage.getGraphics();
42 g.drawImage(image, 0, 0, null);
43 g.dispose();
44 return compatibleImage;
45 }
46 }
6) 通过直接操作BufferedImage对象内部的光栅对象来处理图像的每一个像素。
1 public class MyTest extends JPanel {
2 private BufferedImage srcImage;
3 private BufferedImage flippedImage;
4 MyTest() {
5 try {
6 Image image = ImageIO.read(new File("D:/desktop.png"));
7 // 由于该测试图片是桌面的快照,因此比较大,这里为了显示方便需要截取
8 srcImage = new BufferedImage(300,300, BufferedImage.TYPE_INT_ARGB);
9 Graphics g = srcImage.getGraphics();
10 g.drawImage(image, 0, 0, 300,300,0,0,300,300,null);
11 flippedImage = new BufferedImage(srcImage.getWidth(),
12 srcImage.getHeight(), srcImage.getType());
13 //直接获取源图像和目的图像的光栅数据
14 DataBuffer dbSrc = srcImage.getRaster().getDataBuffer();
15 DataBuffer dbFlipped = flippedImage.getRaster().getDataBuffer();
16 //直接操作光栅数据,这里将源图像的数据数组反向写入目标图像。
17 //从而达到翻转的效果
18 for (int i = dbSrc.getSize() - 1, j = 0; i >= 0; --i, j++) {
19 dbFlipped.setElem(j, dbSrc.getElem(i));
20 }
21 } catch (IOException e) {
22 }
23 }
24 public void paintComponent(Graphics g) {
25 super.paintComponent(g);
26 g.drawImage(srcImage, 0, 0, null);
27 g.drawImage(flippedImage,300,0,null);
28 }
29 public static void main(String[] args) throws IOException {
30 JFrame frame = new JFrame();
31 frame.setTitle("Write with Raster");
32 frame.setSize(600, 300);
33 frame.addWindowListener(new WindowAdapter() {
34 public void windowClosing(WindowEvent e) {
35 System.exit(0);
36 }
37 });
38 Container contentPane = frame.getContentPane();
39 contentPane.add(new MyTest());
40 frame.show();
41 }
42 }
7) 通过直接操作像素颜色数组的方式更新BufferedImage的光栅数据:
1 public class MyTest extends JPanel {
2 public static void main(String[] args) throws IOException {
3 JFrame frame = new JFrame();
4 frame.setTitle("");
5 frame.setSize(600, 300);
6 frame.addWindowListener(new WindowAdapter() {
7 public void windowClosing(WindowEvent e) {
8 System.exit(0);
9 }
10 });
11 Container contentPane = frame.getContentPane();