OSDN Git Service

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