当前位置:编程学习 > JAVA >>

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

 

本篇将继续介绍Java 2D 图形部分的内容。

    10.    BufferedImage:

    BufferedImage中包含着width*height个像素点的颜色值,同时BufferedImage中还带有色彩模型(ColorModel)的信息,用于描述像素点的颜色模型,如TYPE_INT_ARGB、TYPE_INT_RGB等。Graphic2D在渲染目标图像时,也需要依照ColorModel来计算图像像素的颜色信息并执行渲染。

    在有些情况下,我们需要对BufferedImage中的每一个像素的颜色值进行计算,并将计算的结果回写到BufferedImage中相应的位置。那么我们是如果获取这些像素信息的呢?又是如果将计算后的颜色值回写的呢?Java 2D中提供了BufferedImage.getRaster()方法,可以直接获取BufferedImage中的光栅信息,再通过WritableRaster.getPixel()方法获取指定位置的像素的颜色值。在对取得的颜色值执行必要的计算后,可通过WritableRaster.setPixel()方法将计算结果回写到光栅的指定位置中。如果图像很大,这样反复的调用getPixel()/setPixel()势必会引起效率问题,WritableRaster为我们提供了getPixels()/setPixels()方法,可以一次获取/回写一组像素颜色值。其使用方式和getPixel()/setPixel()基本一致。

    试想一下,如果我们需要每一种颜色模型(ColorModel)都实现一种处理和计算逻辑,这样会给我们的图形算法带来一些额外的负担,使我们的算法不得不和这些细节打交道,我想这并不是我们希望看到的结果,还有更好的方式可以规避这样的问题吗?答案是肯定的,Java 2D通过下面两条语句来获取标准的颜色值:

    BufferedImage img = loadImageFromFile(filename);

    Raster r = img.getRaster();

    ColorModel cm = img.getColorModel();

    Object data = r.getDataElements(x,y,null);

    int argb = cm.getRGB(data);

    在基于标准ARGB模型的颜色值计算后,可将结果颜色值通过下面两条语句回写到光栅的指定位置。

    Object data = cm.getDataElements(argb,null);

    r.setDataElements(x,y,data);

    下面提供几个典型的代码示例,以供参考。

    1)    在Graphics上绘制BufferedImage的一个简单示例:

    主要功能是将一个图片切割成为4份(2行* 2列),然后再将切分后的4个子图像进行乱序,换句话说,就是让切割后的子图像不在显示在原有的位置上,最后渲染到Swing的组件上。

 1     public class MyTest extends JPanel {

 2         private int numlocs = 2;

 3         private int numcells = numlocs * numlocs;

 4         private int[] cells;

 5         private BufferedImage bi;

 6         private int w, h, cw, ch;

 7         public MyTest() {

 8             try {

 9                 bi = ImageIO.read(new File("D:/desktop.png"));

10                 w = bi.getWidth();

11                 h = bi.getHeight();

12             } catch (IOException e) {

13                 e.printStackTrace();

14             }

15             //将整个图片分隔成为4分,2行* 2列,这里cx和cy是每个子图片的宽和高

16             cw = w / numlocs;

17             ch = h / numlocs;

18             cells = new int[numcells];

19             //初始化每个子图片的位置信息

20             for (int i = 0; i < numcells; i++)

21                 cells[i] = i;

22         }

23         void doExchange() {

24             Random rand = new Random();

25             int ri;

26             //将2 * 2 = 4个图片的位置通过随机数的方式打乱。

27             for (int i = 0; i < numcells; i++) {

28                 while ((ri = rand.nextInt(numlocs)) == i) {

29                 }

30                 int tmp = cells[i];

31                 cells[i] = cells[ri];

32                 cells[ri] = tmp;

33             }

34         }

35         public void paintComponent(Graphics g) {

36             super.paintComponent(g);

37             int dx, dy;

38             //逐个渲染乱序后的每个子图片

39             for (int x = 0; x < numlocs; x++) {

40                 int sx = x * cw;

41                 for (int y = 0; y < numlocs; y++) {

42                     int sy = y * ch;

43                     int cell = cells[x * numlocs + y];

44                     dx = (cell / numlocs) * cw;

45                     dy = (cell % numlocs) * ch;

46                     //参数说明:

47                     //BufferedImage: 目标绘制图像缓冲区

48                     //dx1,dy1: 绘制目标的左上角x,y坐标

49             

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,