Step By Step(Java 2D图形篇<三>) (五)

2014-11-24 03:21:36 · 作者: · 浏览: 5
GraphicsConfiguration gc = getConfiguration();

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();