OSDN Git Service

[TAG]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.2.0 / src / jp / nyatla / utils / j2se / LabelingBufferdImage.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java version ARToolkit class library.\r
11  * Copyright (C)2008 R.Iizuka\r
12  *\r
13  * This program is free software; you can redistribute it and/or\r
14  * modify it under the terms of the GNU General Public License\r
15  * as published by the Free Software Foundation; either version 2\r
16  * of the License, or (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  * \r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this framework; if not, write to the Free Software\r
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
26  * \r
27  * For further information please contact.\r
28  *      http://nyatla.jp/nyatoolkit/\r
29  *      <airmail(at)ebony.plala.or.jp>\r
30  * \r
31  */\r
32 package jp.nyatla.utils.j2se;\r
33 \r
34 import java.awt.Graphics;\r
35 import java.awt.image.*;\r
36 import java.awt.color.*;\r
37 import java.awt.*;\r
38 \r
39 \r
40 import jp.nyatla.nyartoolkit.NyARException;\r
41 import jp.nyatla.nyartoolkit.core.types.*;\r
42 import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
43 import jp.nyatla.nyartoolkit.core.raster.*;\r
44 import jp.nyatla.nyartoolkit.core.types.stack.*;\r
45 import jp.nyatla.nyartoolkit.core.labeling.*;\r
46 \r
47 /**\r
48  * bitmapとして利用可能なラベリングイメージです。\r
49  * \r
50  * \r
51  */\r
52 public class LabelingBufferdImage extends BufferedImage\r
53 {\r
54         public final static int COLOR_125_COLOR = 0;// 125色ラベルモード\r
55 \r
56         public final static int COLOR_256_MONO = 1;// 64階調モノクロモード\r
57 \r
58         public final static int COLOR_64_MONO = 2;// 64階調モノクロモード\r
59 \r
60         public final static int COLOR_32_MONO = 3;// 32階調モノクロモード\r
61 \r
62         public final static int COLOR_16_MONO = 4;// 16階調モノクロモード\r
63 \r
64         public final static int COLOR_8_MONO = 5;// 16階調モノクロモード\r
65 \r
66         private int[] _rgb_table_125;\r
67 \r
68 \r
69         /**\r
70          * i_width x i_heightの大きさのイメージを作成します。\r
71          * \r
72          * @param i_width\r
73          * @param i_height\r
74          */\r
75         public LabelingBufferdImage(int i_width, int i_height)\r
76         {\r
77                 super(i_width, i_height, ColorSpace.TYPE_RGB);\r
78                 // RGBテーブルを作成\r
79                 this._rgb_table_125 = new int[125];\r
80                 for (int i = 0; i < 5; i++) {\r
81                         for (int i2 = 0; i2 < 5; i2++) {\r
82                                 for (int i3 = 0; i3 < 5; i3++) {\r
83                                         this._rgb_table_125[((i * 5) + i2) * 5 + i3] = ((((i * 63) << 8) | (i2 * 63)) << 8) | (i3 * 63);\r
84                                 }\r
85                         }\r
86                 }\r
87 /*              case COLOR_256_MONO:\r
88                         this._rgb_table = new int[256];\r
89                         this._number_of_color = 256;\r
90                         for (int i = 0; i < 256; i++) {\r
91                                 this._rgb_table[i] = (i << 16) | (i << 8) | i;\r
92                         }\r
93                         break;\r
94                 case COLOR_64_MONO:\r
95                         this._rgb_table = new int[64];\r
96                         this._number_of_color = 64;\r
97                         for (int i = 0; i < 64; i++) {\r
98                                 int m = (i * 4);\r
99                                 this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
100                         }\r
101                         break;\r
102                 case COLOR_32_MONO:\r
103                         this._rgb_table = new int[32];\r
104                         this._number_of_color = 32;\r
105                         for (int i = 0; i < 32; i++) {\r
106                                 int m = (i * 8);\r
107                                 this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
108                         }\r
109                         break;\r
110                 case COLOR_16_MONO:\r
111                         this._rgb_table = new int[32];\r
112                         this._number_of_color = 16;\r
113                         for (int i = 0; i < 16; i++) {\r
114                                 int m = (i * 8);\r
115                                 this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
116                         }\r
117                         break;\r
118                 }*/\r
119         }\r
120 \r
121 \r
122 \r
123         public void drawImage(NyARGrayscaleRaster i_raster) throws NyARException\r
124         {\r
125                 assert (i_raster.getBufferReader().getBufferType() == INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8);\r
126 \r
127                 int w = this.getWidth();\r
128                 int h = this.getHeight();\r
129                 // サイズをチェック\r
130                 NyARIntSize size = i_raster.getSize();\r
131                 if (size.h > h || size.w > w) {\r
132                         throw new NyARException();\r
133                 }\r
134 \r
135                 int[] limg;\r
136                 // イメージの描画\r
137                 limg = (int[]) i_raster.getBufferReader().getBuffer();\r
138                 for (int i = 0; i < h; i++) {\r
139                         for (int i2 = 0; i2 < w; i2++) {\r
140                                 this.setRGB(i2, i,limg[i*w+i2]);\r
141                         }\r
142                 }\r
143                 return;\r
144         }\r
145         /**\r
146          * バイナリラスタ\r
147          * @param i_raster\r
148          * @throws NyARException\r
149          */\r
150         public void drawImage(NyARBinRaster i_raster) throws NyARException\r
151         {\r
152                 assert (i_raster.getBufferReader().getBufferType() == INyARBufferReader.BUFFERFORMAT_INT1D_BIN_8);\r
153 \r
154                 int w = this.getWidth();\r
155                 int h = this.getHeight();\r
156                 // サイズをチェック\r
157                 NyARIntSize size = i_raster.getSize();\r
158                 if (size.h > h || size.w > w) {\r
159                         throw new NyARException();\r
160                 }\r
161 \r
162                 int[] limg;\r
163                 // イメージの描画\r
164                 limg = (int[]) i_raster.getBufferReader().getBuffer();\r
165                 for (int i = 0; i < h; i++) {\r
166                         for (int i2 = 0; i2 < w; i2++) {\r
167                                 this.setRGB(i2, i, limg[i*w+i2] > 0 ? 255 : 0);\r
168                         }\r
169                 }\r
170                 return;\r
171         }\r
172                 \r
173         /**\r
174          * ラベリングイメージを書く\r
175          * @param i_raster\r
176          * @throws NyARException\r
177          */\r
178         public void drawLabel(NyARLabelingImage i_image) throws NyARException\r
179         {\r
180                 int w = this.getWidth();\r
181                 int h = this.getHeight();\r
182                 // サイズをチェック\r
183                 NyARIntSize size = i_image.getSize();\r
184                 if (size.h > h || size.w > w) {\r
185                         throw new NyARException();\r
186                 }\r
187                 int[] index_array=i_image.getIndexArray();\r
188 \r
189                 int[] limg;\r
190                 // イメージの描画\r
191                 limg = (int[]) i_image.getBufferReader().getBuffer();\r
192                 for (int i = 0; i < h; i++) {\r
193                         for (int i2 = 0; i2 < w; i2++) {\r
194                                 int t=limg[i*w+i2]-1;\r
195                                 if(t<0){\r
196                                         t=0;\r
197                                 }else{\r
198                                         t=index_array[t];\r
199                                 }\r
200                                 this.setRGB(i2, i,_rgb_table_125[t% _rgb_table_125.length]);\r
201                         }\r
202                 }\r
203                 return;\r
204         }\r
205         /**\r
206          * \r
207          * @param i_stack\r
208          */\r
209 \r
210         public void overlayData(NyARLabelingLabel i_label)\r
211         {\r
212                 Graphics g = this.getGraphics();\r
213                 g.setColor(Color.red);\r
214                 g.drawRect(i_label.clip_l,i_label.clip_t,i_label.clip_r-i_label.clip_l,i_label.clip_b-i_label.clip_t);\r
215                 return;\r
216         }       \r
217         /**\r
218          * \r
219          * @param i_stack\r
220          */\r
221 \r
222         public void overlayData(NyARIntPointStack i_stack)\r
223         {\r
224                 int count = i_stack.getLength();\r
225                 NyARIntPoint[] items = (NyARIntPoint[])i_stack.getArray();\r
226                 Graphics g = this.getGraphics();\r
227                 for (int i = 0; i < count; i++) {\r
228                         int x = items[i].x;\r
229                         int y = items[i].y;\r
230                         g.setColor(Color.red);\r
231                         g.drawLine(x - 5, y, x + 5, y);\r
232                         g.drawLine(x, y + 5, x, y - 5);\r
233                 }\r
234                 return;\r
235         }\r
236         public void overlayData(NyARIntRectStack i_stack)\r
237         {\r
238                 Color[] c=new Color[]{Color.cyan,Color.red,Color.green};\r
239                 int count = i_stack.getLength();\r
240                 NyARIntRect[] items = (NyARIntRect[])i_stack.getArray();\r
241                 Graphics g = this.getGraphics();\r
242                 for (int i = 0; i < count; i++) {\r
243                         int x = items[i].x;\r
244                         int y = items[i].y;\r
245                         g.setColor(c[i%1]);\r
246                         g.drawRect(x,y,items[i].w,items[i].h);\r
247                 }\r
248                 return;\r
249         }\r
250 }\r