OSDN Git Service

Merge branch 'git-svn'
[nyartoolkit-and/nyartoolkit-and.git] / tags / 1.3.1 / sample / qt / jp / nyatla / nyartoolkit / qt / utils / QtNyARRaster_RGB.java
1 /**\r
2  * RGB形式のbyte配列をラップするNyARRasterです。\r
3  * 保持したデータからBufferedImageを出力する機能も持ちます。\r
4  * (c)2008 arc@dmz, A虎@nyatla.jp\r
5  * arc@digitalmuseum.jp\r
6  * http://nyatla.jp/\r
7  */\r
8 package jp.nyatla.nyartoolkit.qt.utils;\r
9 \r
10 \r
11 import java.awt.image.BufferedImage;\r
12 import java.awt.image.DataBuffer;\r
13 import java.awt.image.WritableRaster;\r
14 \r
15 import jp.nyatla.nyartoolkit.NyARException;\r
16 import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
17 \r
18 \r
19 public class QtNyARRaster_RGB implements NyARRaster\r
20 {\r
21     protected byte[] ref_buf;\r
22     protected int width=0;\r
23     protected int height=0;\r
24         private WritableRaster raster;\r
25         private BufferedImage image;\r
26 \r
27 \r
28     /**\r
29      * RGB形式のJMFバッファをラップするオブジェクトをつくります。\r
30      * 生成直後のオブジェクトはデータを持ちません。\r
31      * メンバ関数はsetBufferを実行後に使用可能になります。\r
32      */\r
33     public QtNyARRaster_RGB(int i_width,int i_height)\r
34     {\r
35         ref_buf=null;\r
36         width=i_width;\r
37         height=i_height;\r
38         raster = WritableRaster.createInterleavedRaster(DataBuffer.TYPE_BYTE,\r
39                         width, height,\r
40                         width*3, 3,\r
41                         new int[] { 0, 1, 2 }, null); \r
42         image = new BufferedImage(width, height,\r
43                         BufferedImage.TYPE_3BYTE_BGR);\r
44     }\r
45     /**\r
46      * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。\r
47      * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。\r
48      * @param i_buffer\r
49      * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。\r
50      * @return\r
51      * i_bufferをラップしたオブジェクトを返します。\r
52      * @throws NyARException\r
53      */\r
54     public void setBuffer(byte[] i_buffer)\r
55     {\r
56         ref_buf=i_buffer;\r
57     }\r
58     public int getPixelTotal(int i_x,int i_y)\r
59     {\r
60         int bp=(i_x+i_y*width)*3;\r
61         byte[] ref=this.ref_buf;\r
62         return (ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
63     }\r
64     public void getPixelTotalRowLine(int i_row,int[] o_line)\r
65     {\r
66         final byte[] ref=this.ref_buf;\r
67         int bp=(i_row+1)*this.width*3-3;\r
68         for(int i=this.width-1;i>=0;i--){\r
69             o_line[i]=(ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
70             bp-=3;\r
71         }\r
72     }    \r
73     public int getWidth()\r
74     {\r
75         return width;\r
76     }\r
77     public int getHeight()\r
78     {\r
79         return height;\r
80     }\r
81     public void getPixel(int i_x,int i_y,int[] i_rgb)\r
82     {\r
83         int bp=(i_x+i_y*this.width)*3;\r
84         byte[] ref=this.ref_buf;\r
85         i_rgb[0]=ref[bp+0];//R\r
86         i_rgb[1]=ref[bp+1];//G\r
87         i_rgb[2]=ref[bp+2];//B\r
88     }\r
89     /**\r
90      * データを持っているかを返します。\r
91      * @return\r
92      */\r
93     public boolean hasData()\r
94     {\r
95         return ref_buf!=null;\r
96     }\r
97     public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb)\r
98     {\r
99         int width=this.width;\r
100         byte[] ref=this.ref_buf;\r
101         int bp;\r
102         for(int i=i_num-1;i>=0;i--){\r
103             bp=(i_x[i]+i_y[i]*width)*3;\r
104             o_rgb[i*3+0]=ref[bp+0];//R\r
105             o_rgb[i*3+1]=ref[bp+1];//G\r
106             o_rgb[i*3+2]=ref[bp+2];//B\r
107         }       \r
108         return;\r
109     }\r
110 \r
111     /** 保持しているデータからBufferedImageを作って返します。 */\r
112     public BufferedImage createImage() {\r
113                 raster.setDataElements(0, 0, width, height, ref_buf);\r
114         image.setData(raster);\r
115         return image;\r
116     }\r
117 }\r