OSDN Git Service

[TAG]NyARToolkit/2.5.0
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.5.0 / src / jp / nyatla / nyartoolkit / core / rasterfilter / NyARRasterFilter_Rgb2Hsv.java
diff --git a/tags/2.5.0/src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Rgb2Hsv.java b/tags/2.5.0/src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Rgb2Hsv.java
new file mode 100644 (file)
index 0000000..634a11d
--- /dev/null
@@ -0,0 +1,96 @@
+package jp.nyatla.nyartoolkit.core.rasterfilter;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+/**\r
+ * RGB画像をHSV画像に変換します。\r
+ *\r
+ */\r
+public class NyARRasterFilter_Rgb2Hsv implements INyARRasterFilter\r
+{\r
+       private IdoFilterImpl _dofilterimpl;\r
+       public NyARRasterFilter_Rgb2Hsv(int i_raster_type) throws NyARException\r
+       {\r
+               switch (i_raster_type) {\r
+               case NyARBufferType.BYTE1D_B8G8R8_24:\r
+                       this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();\r
+                       break;\r
+               case NyARBufferType.BYTE1D_R8G8B8_24:\r
+               default:\r
+                       throw new NyARException();\r
+               }\r
+       }\r
+       public void doFilter(INyARRaster i_input, INyARRaster i_output) throws NyARException\r
+       {\r
+               assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+               this._dofilterimpl.doFilter(i_input,i_output,i_input.getSize());\r
+       }\r
+       \r
+       abstract class IdoFilterImpl\r
+       {\r
+               public abstract void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException;\r
+               \r
+       }\r
+       class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl\r
+       {\r
+               public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException\r
+               {\r
+                       assert(         i_input.isEqualBufferType(NyARBufferType.INT1D_X7H9S8V8_32));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       int s;\r
+                       for(int i=i_size.h*i_size.w-1;i>=0;i--)\r
+                       {\r
+                               int r=(in_buf[i*3+2] & 0xff);\r
+                               int g=(in_buf[i*3+1] & 0xff);\r
+                               int b=(in_buf[i*3+0] & 0xff);\r
+                               int cmax,cmin;\r
+                               //最大値と最小値を計算\r
+                               if(r>g){\r
+                                       cmax=r;\r
+                                       cmin=g;\r
+                               }else{\r
+                                       cmax=g;\r
+                                       cmin=r;\r
+                               }\r
+                               if(b>cmax){\r
+                                       cmax=b;\r
+                               }\r
+                               if(b<cmin){\r
+                                       cmin=b;\r
+                               }\r
+                               int h;\r
+                               if(cmax==0) {\r
+                                       s=0;\r
+                                       h=0;\r
+                               }else {\r
+                                       s=(cmax-cmin)*255/cmax;\r
+                                       int cdes=cmax-cmin;\r
+                                       //H成分を計算\r
+                                       if(cdes!=0){\r
+                                               if(cmax==r){\r
+                                                       h=(g-b)*60/cdes;\r
+                                               }else if(cmax==g){\r
+                                                       h=(b-r)*60/cdes+2*60;\r
+                                               }else{\r
+                                                       h=(r-g)*60/cdes+4*60;\r
+                                               }\r
+                                       }else{\r
+                                               h=0;\r
+                                       }\r
+                               }\r
+                               if(h<0)\r
+                               {\r
+                                       h+=360;\r
+                               }\r
+                               //hsv変換(h9s8v8)\r
+                               out_buf[i]=(0x1ff0000&(h<<16))|(0x00ff00&(s<<8))|(cmax&0xff);\r
+                       }\r
+                       return;\r
+               }\r
+       }       \r
+}
\ No newline at end of file