--- /dev/null
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ * Hirokazu Kato\r
+ * Mark Billinghurst\r
+ * HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.utils.j2se;\r
+\r
+import java.awt.Graphics;\r
+import java.awt.image.*;\r
+import java.awt.color.*;\r
+import java.awt.*;\r
+\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.types.stack.*;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingImage;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabel;\r
+\r
+/**\r
+ * bitmapとして利用可能なラベリングイメージです。\r
+ * \r
+ * \r
+ */\r
+public class LabelingBufferdImage extends BufferedImage\r
+{\r
+ public final static int COLOR_125_COLOR = 0;// 125色ラベルモード\r
+\r
+ public final static int COLOR_256_MONO = 1;// 64階調モノクロモード\r
+\r
+ public final static int COLOR_64_MONO = 2;// 64階調モノクロモード\r
+\r
+ public final static int COLOR_32_MONO = 3;// 32階調モノクロモード\r
+\r
+ public final static int COLOR_16_MONO = 4;// 16階調モノクロモード\r
+\r
+ public final static int COLOR_8_MONO = 5;// 16階調モノクロモード\r
+\r
+ private int[] _rgb_table_125;\r
+\r
+\r
+ /**\r
+ * i_width x i_heightの大きさのイメージを作成します。\r
+ * \r
+ * @param i_width\r
+ * @param i_height\r
+ */\r
+ public LabelingBufferdImage(int i_width, int i_height)\r
+ {\r
+ super(i_width, i_height, ColorSpace.TYPE_RGB);\r
+ // RGBテーブルを作成\r
+ this._rgb_table_125 = new int[125];\r
+ for (int i = 0; i < 5; i++) {\r
+ for (int i2 = 0; i2 < 5; i2++) {\r
+ for (int i3 = 0; i3 < 5; i3++) {\r
+ this._rgb_table_125[((i * 5) + i2) * 5 + i3] = ((((i * 63) << 8) | (i2 * 63)) << 8) | (i3 * 63);\r
+ }\r
+ }\r
+ }\r
+/* case COLOR_256_MONO:\r
+ this._rgb_table = new int[256];\r
+ this._number_of_color = 256;\r
+ for (int i = 0; i < 256; i++) {\r
+ this._rgb_table[i] = (i << 16) | (i << 8) | i;\r
+ }\r
+ break;\r
+ case COLOR_64_MONO:\r
+ this._rgb_table = new int[64];\r
+ this._number_of_color = 64;\r
+ for (int i = 0; i < 64; i++) {\r
+ int m = (i * 4);\r
+ this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
+ }\r
+ break;\r
+ case COLOR_32_MONO:\r
+ this._rgb_table = new int[32];\r
+ this._number_of_color = 32;\r
+ for (int i = 0; i < 32; i++) {\r
+ int m = (i * 8);\r
+ this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
+ }\r
+ break;\r
+ case COLOR_16_MONO:\r
+ this._rgb_table = new int[32];\r
+ this._number_of_color = 16;\r
+ for (int i = 0; i < 16; i++) {\r
+ int m = (i * 8);\r
+ this._rgb_table[i] = (m << 16) | (m << 8) | m;\r
+ }\r
+ break;\r
+ }*/\r
+ }\r
+\r
+\r
+\r
+ public void drawImage(NyARGrayscaleRaster i_raster) throws NyARException\r
+ {\r
+ assert (i_raster.getBufferType() == NyARBufferType.INT1D_GRAY_8);\r
+\r
+ int w = this.getWidth();\r
+ int h = this.getHeight();\r
+ // サイズをチェック\r
+ NyARIntSize size = i_raster.getSize();\r
+ if (size.h > h || size.w > w) {\r
+ throw new NyARException();\r
+ }\r
+\r
+ int[] limg;\r
+ // イメージの描画\r
+ limg = (int[]) i_raster.getBuffer();\r
+ for (int i = 0; i < h; i++) {\r
+ for (int i2 = 0; i2 < w; i2++) {\r
+ this.setRGB(i2, i,limg[i*w+i2]);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * バイナリラスタ\r
+ * @param i_raster\r
+ * @throws NyARException\r
+ */\r
+ public void drawImage(NyARBinRaster i_raster) throws NyARException\r
+ {\r
+ assert (i_raster.getBufferType() == NyARBufferType.INT1D_BIN_8);\r
+\r
+ int w = this.getWidth();\r
+ int h = this.getHeight();\r
+ // サイズをチェック\r
+ NyARIntSize size = i_raster.getSize();\r
+ if (size.h > h || size.w > w) {\r
+ throw new NyARException();\r
+ }\r
+\r
+ int[] limg;\r
+ // イメージの描画\r
+ limg = (int[]) i_raster.getBuffer();\r
+ for (int i = 0; i < h; i++) {\r
+ for (int i2 = 0; i2 < w; i2++) {\r
+ this.setRGB(i2, i, limg[i*w+i2] > 0 ? 255 : 0);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ \r
+ /**\r
+ * ラベリングイメージを書く\r
+ * @param i_raster\r
+ * @throws NyARException\r
+ */\r
+ public void drawLabel(NyARLabelingImage i_image) throws NyARException\r
+ {\r
+ int w = this.getWidth();\r
+ int h = this.getHeight();\r
+ // サイズをチェック\r
+ NyARIntSize size = i_image.getSize();\r
+ if (size.h > h || size.w > w) {\r
+ throw new NyARException();\r
+ }\r
+ int[] index_array=i_image.getIndexArray();\r
+\r
+ int[] limg;\r
+ // イメージの描画\r
+ limg = (int[]) i_image.getBuffer();\r
+ for (int i = 0; i < h; i++) {\r
+ for (int i2 = 0; i2 < w; i2++) {\r
+ int t=limg[i*w+i2]-1;\r
+ if(t<0){\r
+ t=0;\r
+ }else{\r
+ t=index_array[t];\r
+ }\r
+ this.setRGB(i2, i,_rgb_table_125[t% _rgb_table_125.length]);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * \r
+ * @param i_stack\r
+ */\r
+\r
+ public void overlayData(NyARLabelingLabel i_label)\r
+ {\r
+ Graphics g = this.getGraphics();\r
+ g.setColor(Color.red);\r
+ 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
+ return;\r
+ } \r
+ /**\r
+ * \r
+ * @param i_stack\r
+ */\r
+\r
+ public void overlayData(NyARIntPointStack i_stack)\r
+ {\r
+ int count = i_stack.getLength();\r
+ NyARIntPoint2d[] items = i_stack.getArray();\r
+ Graphics g = this.getGraphics();\r
+ for (int i = 0; i < count; i++) {\r
+ int x = items[i].x;\r
+ int y = items[i].y;\r
+ g.setColor(Color.red);\r
+ g.drawLine(x - 5, y, x + 5, y);\r
+ g.drawLine(x, y + 5, x, y - 5);\r
+ }\r
+ return;\r
+ }\r
+ public void overlayData(NyARIntRectStack i_stack)\r
+ {\r
+ Color[] c=new Color[]{Color.cyan,Color.red,Color.green};\r
+ int count = i_stack.getLength();\r
+ NyARIntRect[] items = i_stack.getArray();\r
+ Graphics g = this.getGraphics();\r
+ for (int i = 0; i < count; i++) {\r
+ int x = items[i].x;\r
+ int y = items[i].y;\r
+ g.setColor(c[i%1]);\r
+ g.drawRect(x,y,items[i].w,items[i].h);\r
+ }\r
+ return;\r
+ }\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.utils.j2se;\r
+\r
+import java.awt.Graphics;\r
+import java.awt.Transparency;\r
+import java.awt.color.ColorSpace;\r
+import java.awt.image.*;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.INyARRgbPixelReader;\r
+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+/**\r
+ * バッファにBufferedImageを使用するNyARRgbRasterです。\r
+ * ラップするbufferedImageの種類によっては、パフォーマンスが低下する事があるので注意してください。\r
+ * @author nyatla\r
+ *\r
+ */\r
+public class NyARBufferedImageRaster extends NyARRgbRaster\r
+{\r
+ private BufferedImage _buffered_image;\r
+ protected boolean initInstance(NyARIntSize i_size,int i_raster_type,boolean i_is_alloc)\r
+ {\r
+ if(super.initInstance(i_size, i_raster_type, i_is_alloc)){\r
+ return true;\r
+ }\r
+ if(i_raster_type!=NyARBufferType.OBJECT_Java_BufferedImage)\r
+ {\r
+ return false;\r
+ }\r
+ //内部バッファは作れない。\r
+ if(i_is_alloc){\r
+ return false;\r
+ }\r
+ //Readerの作成。\r
+ this._reader=new NyARRgbPixelReader_OBJECT_Java_BufferedImage(null);\r
+ return true;\r
+ }\r
+\r
+ /**\r
+ * NyARBufferTypeと互換性のある形式のBufferedImageを作成します。\r
+ * @param i_width\r
+ * @param i_height\r
+ * @param i_raster_type\r
+ * バッファタイプを指定します。使用できるラスタタイプは、次の種類です。\r
+ * NyARBufferType.BYTE1D_R8G8B8_24,NyARBufferType.BYTE1D_B8G8R8_24,NyARBufferType.INT1D_X8R8G8B8_32,NyARBufferType.OBJECT_Java_BufferedImage\r
+ * NyARBufferType.OBJECT_Java_BufferedImageは低速低速です。パフォーマンスが必要なシステムでは他のバッファタイプを指定してください。\r
+ * NyARToolKitの入力・出力に使用する場合は、関数に最適なバッファタイプを使用するとパフォーマンスが向上します。詳細は関数のドキュメントを参照してください。\r
+ * (NyARBufferType.OBJECT_Java_BufferedImageは全ての関数で低速であり、他の直値タイプは概ね高速に動作します。)\r
+ * @throws NyARException\r
+ */\r
+ public NyARBufferedImageRaster(int i_width,int i_height,int i_raster_type) throws NyARException\r
+ {\r
+ //一旦外部参照で作る。\r
+ super(i_width,i_height,i_raster_type,false);\r
+ //このラスタに合致したBufferedImageを作る。\r
+ BufferedImage ret;\r
+ switch(i_raster_type)\r
+ {\r
+ case NyARBufferType.BYTE1D_R8G8B8_24:{\r
+ byte[] b=new byte[3*i_width*i_height];\r
+ DataBufferByte d=new DataBufferByte(b,b.length);\r
+ int[] bof={0,1,2};\r
+ ret=new BufferedImage(\r
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),false,true,Transparency.OPAQUE,DataBuffer.TYPE_BYTE),\r
+ Raster.createWritableRaster(new ComponentSampleModel(d.getDataType(),i_width,i_height,3,3*i_width,bof),d,null),\r
+ true,null);\r
+ }\r
+ break;\r
+ case NyARBufferType.BYTE1D_B8G8R8_24:{\r
+ byte[] b=new byte[3*i_width*i_height];\r
+ DataBufferByte d=new DataBufferByte(b,b.length);\r
+ int[] bof={2,1,0};\r
+ ret=new BufferedImage(\r
+ new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),false,true,Transparency.OPAQUE,DataBuffer.TYPE_BYTE),\r
+ Raster.createWritableRaster(new ComponentSampleModel(d.getDataType(),i_width,i_height,3,3*i_width,bof),d,null),\r
+ true,null);\r
+ }\r
+ break;\r
+ case NyARBufferType.INT1D_X8R8G8B8_32:{\r
+ int[] b=new int[i_width*i_height];\r
+ DataBufferInt d=new DataBufferInt(b,b.length);\r
+ int[] msk={0xff0000,0x00ff00,0x0000ff};\r
+ ret=new BufferedImage(\r
+ new DirectColorModel(24,msk[0],msk[1],msk[2]),\r
+ Raster.createWritableRaster(new SinglePixelPackedSampleModel(d.getDataType(),i_width,i_height,msk),d,null),\r
+ true,null);\r
+ }\r
+ break;\r
+ case NyARBufferType.OBJECT_Java_BufferedImage:{\r
+ ret=new BufferedImage(i_width,i_height,BufferedImage.TYPE_INT_RGB);\r
+ }\r
+ break;\r
+ default:\r
+ //このデータタイプのラスタは作れない。\r
+ throw new NyARException();\r
+ }\r
+ if(i_raster_type==NyARBufferType.OBJECT_Java_BufferedImage){\r
+ this.wrapBuffer(ret);\r
+ //低速インタフェイス警告\r
+ System.out.println("NyARToolKit Warning:"+this.getClass().getName()+":Low speed interface.");\r
+ }else{\r
+ //rastertype毎にDatabufferの実体の取得方法を変える。\r
+ switch(ret.getRaster().getDataBuffer().getDataType())\r
+ {\r
+ case DataBuffer.TYPE_BYTE:\r
+ this.wrapBuffer(((DataBufferByte)(ret.getRaster().getDataBuffer())).getData());\r
+ break;\r
+ case DataBuffer.TYPE_INT:\r
+ this.wrapBuffer(((DataBufferInt)(ret.getRaster().getDataBuffer())).getData());\r
+ break;\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ }\r
+ //内部参照に切り替える。\r
+ this._is_attached_buffer=true;\r
+ this._buffered_image=ret;\r
+ return;\r
+ }\r
+ /**\r
+ * 既にあるbufferedImageをラップしてラスタをつくります。BufferedImageの内容により、ラスタタイプは自動的に決定します。\r
+ * @param i_bfi\r
+ * ラップするbufferedImageを設定します。インスタンスが参照するのは、このインスタンスのデフォルトバンクのイメージです。\r
+ * NyARToolKitと互換性が低いBufferedImageを指定すると、パフォーマンスが劣化することがあります。注意してください。\r
+ * @throws NyARException\r
+ */\r
+ public NyARBufferedImageRaster(BufferedImage i_bfi) throws NyARException\r
+ {\r
+ //ラスタタイプを確定させて、一旦外部参照で作る。\r
+ super(i_bfi.getWidth(),i_bfi.getHeight(),getRasterTypeFromBufferedImage(i_bfi),false);\r
+ if(this.getBufferType()!=NyARBufferType.OBJECT_Java_BufferedImage)\r
+ {\r
+ //RawImage系のバッファが割り当てられていたら、設定。\r
+ switch(i_bfi.getRaster().getDataBuffer().getDataType())\r
+ {\r
+ case DataBuffer.TYPE_BYTE:\r
+ this.wrapBuffer(((DataBufferByte)(i_bfi.getRaster().getDataBuffer())).getData());\r
+ break;\r
+ case DataBuffer.TYPE_INT:\r
+ this.wrapBuffer(((DataBufferInt)(i_bfi.getRaster().getDataBuffer())).getData());\r
+ break;\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ }else{\r
+ this.wrapBuffer(i_bfi);\r
+ //低速インタフェイス警告\r
+ System.out.println("NyARToolKit Warning:"+this.getClass().getName()+":Low speed interface.");\r
+ }\r
+ //内部参照に切り替える。\r
+ this._is_attached_buffer=true;\r
+ this._buffered_image=i_bfi;\r
+ return;\r
+ }\r
+ /**\r
+ * BufferedImageを返します。\r
+ * @return\r
+ */\r
+ public final BufferedImage getBufferedImage()\r
+ {\r
+ return this._buffered_image;\r
+ }\r
+ /**\r
+ * BufferedImageのGraphicsを返します。\r
+ * @return\r
+ */\r
+ public final Graphics getGraphics()\r
+ {\r
+ return this._buffered_image.getGraphics();\r
+ }\r
+\r
+ /**\r
+ * BufferedImageを分析して、WriterbleRasterと互換性のあるNyARBufferTypeを調べます。\r
+ * @param im\r
+ * @return\r
+ */\r
+ private static int getRasterTypeFromBufferedImage(BufferedImage im)\r
+ {\r
+ WritableRaster wr=im.getRaster();\r
+ SampleModel sp=wr.getSampleModel();\r
+ int w=im.getWidth();\r
+ if(sp instanceof ComponentSampleModel){\r
+ ComponentSampleModel csp=(ComponentSampleModel)sp;\r
+ int data_type=csp.getDataType();\r
+ int band_num=csp.getNumBands();\r
+ int pix_stride=csp.getPixelStride();\r
+ int scan_stride=csp.getScanlineStride();\r
+ int[] indices=csp.getBankIndices();\r
+ int[] band_offset=csp.getBandOffsets();\r
+ //BYTE1D_XXX_24の可能性があるかを確認。\r
+ if(data_type==DataBuffer.TYPE_BYTE && band_num==3 && scan_stride==w*3 && pix_stride==3 && indices[0]==0 && indices[1]==0 && indices[2]==0)\r
+ {\r
+ if(band_offset[0]==0 && band_offset[1]==1 && band_offset[2]==2)\r
+ {\r
+ return NyARBufferType.BYTE1D_R8G8B8_24;\r
+ }\r
+ if(band_offset[0]==2 && band_offset[1]==1 && band_offset[2]==0)\r
+ {\r
+ return NyARBufferType.BYTE1D_B8G8R8_24;\r
+ }\r
+ }else if(data_type==DataBuffer.TYPE_BYTE && band_num==4&& scan_stride==w*4 && pix_stride==4 && indices[0]==0 && indices[1]==0 && indices[2]==0)\r
+ {\r
+ if(band_offset[0]==3 && band_offset[1]==2 && band_offset[2]==1)\r
+ {\r
+ return NyARBufferType.BYTE1D_B8G8R8X8_32;\r
+ }\r
+ }\r
+ \r
+ }else if(sp instanceof SinglePixelPackedSampleModel)\r
+ {\r
+ SinglePixelPackedSampleModel ssp=(SinglePixelPackedSampleModel)sp;\r
+ int data_type=ssp.getDataType();\r
+ int[] mask=ssp.getBitMasks();\r
+ int scan_stride=ssp.getScanlineStride();\r
+ int[] offset=ssp.getBitOffsets();\r
+ if(data_type==DataBuffer.TYPE_INT && scan_stride==w && offset[0]==16 && offset[1]==8 && offset[2]==0)\r
+ {\r
+ if(mask[0]==0x00ff0000 && mask[1]==0x0000ff00 && mask[2]==0x000000ff){\r
+ return NyARBufferType.INT1D_X8R8G8B8_32;\r
+ }\r
+ }\r
+ }\r
+ //具体的なBufferが判らない。\r
+ return NyARBufferType.OBJECT_Java_BufferedImage;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * BufferedImage用の低速PixelReader\r
+ * @author nyatla\r
+ *\r
+ */\r
+final class NyARRgbPixelReader_OBJECT_Java_BufferedImage implements INyARRgbPixelReader\r
+{\r
+ protected BufferedImage _ref_buf;\r
+ public NyARRgbPixelReader_OBJECT_Java_BufferedImage(BufferedImage _ref_buf)\r
+ {\r
+ this._ref_buf = _ref_buf;\r
+ }\r
+\r
+ public void getPixel(int i_x, int i_y, int[] o_rgb)\r
+ {\r
+ int p=this._ref_buf.getRGB(i_x, i_y);\r
+ o_rgb[0] = ((p>>16) & 0xff);// R\r
+ o_rgb[1] = ((p>>8) & 0xff);// G\r
+ o_rgb[2] = (p & 0xff);// B\r
+ return;\r
+ }\r
+\r
+ public void getPixelSet(int[] i_x, int[] i_y, int i_num, int[] o_rgb)\r
+ {\r
+ for (int i = i_num - 1; i >= 0; i--) {\r
+ int p=this._ref_buf.getRGB(i_x[i],i_y[i]);\r
+ o_rgb[i * 3 +0] = ((p>>16) & 0xff);// R\r
+ o_rgb[i * 3 +1] = ((p>>8) & 0xff);// G\r
+ o_rgb[i * 3 +2] = (p & 0xff);// B \r
+ }\r
+ return;\r
+ }\r
+ public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+ {\r
+ this._ref_buf.setRGB(i_x, i_y, ((i_rgb[0]<<16)&0xff0000)|((i_rgb[1]<<8)&0x00ff00)|((i_rgb[2])&0x0000ff));\r
+ }\r
+ public void setPixel(int i_x, int i_y, int i_r,int i_g,int i_b) throws NyARException\r
+ {\r
+ this._ref_buf.setRGB(i_x, i_y, ((i_r<<16)&0xff0000)|((i_g<<8)&0x00ff00)|(i_b&0x0000ff));\r
+ }\r
+ public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+ {\r
+ NyARException.notImplement(); \r
+ }\r
+ public void switchBuffer(Object i_ref_buffer) throws NyARException\r
+ {\r
+ this._ref_buf=(BufferedImage)i_ref_buffer;\r
+ } \r
+}
\ No newline at end of file
--- /dev/null
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ * Hirokazu Kato\r
+ * Mark Billinghurst\r
+ * HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.utils.j2se;\r
+\r
+\r
+import java.awt.image.*;\r
+import java.awt.*;\r
+import jp.nyatla.nyartoolkit.*;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+/**\r
+ * BufferdImageとRasterイメージ間で、ビットマップをコピーします。\r
+ */\r
+public class NyARRasterImageIO\r
+{\r
+ /**\r
+ * i_inの内容を、o_outへコピーします。2つのイメージは同じサイズでなければなりません。\r
+ * @param i_in\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(INyARRgbRaster i_in,BufferedImage o_out) throws NyARException\r
+ {\r
+ assert i_in.getSize().isEqualSize(o_out.getWidth(), o_out.getHeight());\r
+ \r
+ //thisへ転写\r
+ INyARRgbPixelReader reader=i_in.getRgbPixelReader();\r
+ int[] rgb=new int[3];\r
+\r
+ for(int y=o_out.getHeight()-1;y>=0;y--){\r
+ for(int x=o_out.getWidth()-1;x>=0;x--){\r
+ reader.getPixel(x,y,rgb);\r
+ o_out.setRGB(x,y,(rgb[0]<<16)|(rgb[1]<<8)|rgb[2]);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * i_inの内容を、o_outへコピーします。2つのイメージは同じサイズでなければなりません。\r
+ * @param i_in\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(NyARGrayscaleRaster i_in,BufferedImage o_out) throws NyARException\r
+ {\r
+ assert i_in.getSize().isEqualSize(o_out.getWidth(), o_out.getHeight());\r
+ if(i_in.isEqualBufferType(NyARBufferType.INT1D_GRAY_8))\r
+ {\r
+ final int[] buf=(int[])i_in.getBuffer();\r
+ final int w=o_out.getWidth();\r
+ final int h=o_out.getHeight();\r
+ for(int y=h-1;y>=0;y--){\r
+ for(int x=w-1;x>=0;x--){\r
+ int v=buf[x+y*w];\r
+ o_out.setRGB(x, y,v*(1+0x100+0x10000));\r
+ }\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * i_inの内容を、o_outへコピーします。2つのイメージは同じサイズでなければなりません。\r
+ * @param i_in\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(INyARRaster i_in,BufferedImage o_out) throws NyARException\r
+ {\r
+ assert i_in.getSize().isEqualSize(o_out.getWidth(), o_out.getHeight());\r
+ if(i_in.isEqualBufferType(NyARBufferType.INT1D_BIN_8))\r
+ {\r
+ final int[] buf=(int[])i_in.getBuffer();\r
+ final int w=o_out.getWidth();\r
+ final int h=o_out.getHeight();\r
+ for(int y=h-1;y>=0;y--){\r
+ for(int x=w-1;x>=0;x--){\r
+ o_out.setRGB(x, y,buf[x+y*w]==0?0:0xffffff);\r
+ }\r
+ }\r
+ }\r
+ return;\r
+ } \r
+ /**\r
+ * ヒストグラムを書き出します。\r
+ * @param i_in\r
+ * @param o_out\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(NyARHistogram i_in,int i_l,int i_t,int i_h,Graphics i_g) throws NyARException\r
+ {\r
+ //正規化のための定数を出す。\r
+ int max=0;\r
+ for(int i=0;i<i_in.length;i++){\r
+ max=max<i_in.data[i]?i_in.data[i]:max;\r
+ }\r
+ if(max==0){\r
+ return;\r
+ }\r
+ //ヒストグラムを書く\r
+ for(int i=0;i<i_in.length;i++){\r
+ i_g.drawLine(i_l+i,i_t,i_l+i,i_h-i_h*i_in.data[i]/max);\r
+ }\r
+ return;\r
+ } \r
+ /**\r
+ * i_outへこのイメージを出力します。\r
+ * \r
+ * @param i_out\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(BufferedImage i_in,INyARRgbRaster o_out) throws NyARException\r
+ {\r
+ assert o_out.getSize().isEqualSize(i_in.getWidth(), i_in.getHeight());\r
+ \r
+ //thisへ転写\r
+ INyARRgbPixelReader reader=o_out.getRgbPixelReader();\r
+ int[] rgb=new int[3];\r
+ for(int y=i_in.getHeight()-1;y>=0;y--){\r
+ for(int x=i_in.getWidth()-1;x>=0;x--){\r
+ int pix=i_in.getRGB(x, y);\r
+ rgb[0]=(pix>>16)&0xff;\r
+ rgb[1]=(pix>>8)&0xff;\r
+ rgb[2]=(pix)&0xff;\r
+ reader.setPixel(x,y,rgb);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * BIN_8用\r
+ * @param i_in\r
+ * @throws NyARException\r
+ */\r
+ public static void copy(BufferedImage i_in,INyARRaster o_out) throws NyARException\r
+ {\r
+ assert o_out.getSize().isEqualSize(i_in.getWidth(), i_in.getHeight());\r
+ if(o_out.isEqualBufferType(NyARBufferType.INT1D_BIN_8))\r
+ {\r
+ final int[] buf=(int[])o_out.getBuffer();\r
+ final int w=i_in.getWidth();\r
+ final int h=i_in.getHeight();\r
+ for(int y=h-1;y>=0;y--){\r
+ for(int x=w-1;x>=0;x--){\r
+ buf[x+y*w]=(i_in.getRGB(x, y)&0xffffff)>0?1:0;\r
+ }\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ \r
+}\r