--- /dev/null
+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