OSDN Git Service

634a11dff8fed0b8ca1338214d3b903de2dde125
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / core / rasterfilter / NyARRasterFilter_Rgb2Hsv.java
1 package jp.nyatla.nyartoolkit.core.rasterfilter;\r
2 \r
3 import jp.nyatla.nyartoolkit.NyARException;\r
4 import jp.nyatla.nyartoolkit.core.raster.*;\r
5 import jp.nyatla.nyartoolkit.core.types.NyARBufferType;\r
6 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
7 \r
8 /**\r
9  * RGB画像をHSV画像に変換します。\r
10  *\r
11  */\r
12 public class NyARRasterFilter_Rgb2Hsv implements INyARRasterFilter\r
13 {\r
14         private IdoFilterImpl _dofilterimpl;\r
15         public NyARRasterFilter_Rgb2Hsv(int i_raster_type) throws NyARException\r
16         {\r
17                 switch (i_raster_type) {\r
18                 case NyARBufferType.BYTE1D_B8G8R8_24:\r
19                         this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();\r
20                         break;\r
21                 case NyARBufferType.BYTE1D_R8G8B8_24:\r
22                 default:\r
23                         throw new NyARException();\r
24                 }\r
25         }\r
26         public void doFilter(INyARRaster i_input, INyARRaster i_output) throws NyARException\r
27         {\r
28                 assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
29                 this._dofilterimpl.doFilter(i_input,i_output,i_input.getSize());\r
30         }\r
31         \r
32         abstract class IdoFilterImpl\r
33         {\r
34                 public abstract void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException;\r
35                 \r
36         }\r
37         class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl\r
38         {\r
39                 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size) throws NyARException\r
40                 {\r
41                         assert(         i_input.isEqualBufferType(NyARBufferType.INT1D_X7H9S8V8_32));\r
42                         \r
43                         int[] out_buf = (int[]) i_output.getBuffer();\r
44                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
45                         int s;\r
46                         for(int i=i_size.h*i_size.w-1;i>=0;i--)\r
47                         {\r
48                                 int r=(in_buf[i*3+2] & 0xff);\r
49                                 int g=(in_buf[i*3+1] & 0xff);\r
50                                 int b=(in_buf[i*3+0] & 0xff);\r
51                                 int cmax,cmin;\r
52                                 //最大値と最小値を計算\r
53                                 if(r>g){\r
54                                         cmax=r;\r
55                                         cmin=g;\r
56                                 }else{\r
57                                         cmax=g;\r
58                                         cmin=r;\r
59                                 }\r
60                                 if(b>cmax){\r
61                                         cmax=b;\r
62                                 }\r
63                                 if(b<cmin){\r
64                                         cmin=b;\r
65                                 }\r
66                                 int h;\r
67                                 if(cmax==0) {\r
68                                         s=0;\r
69                                         h=0;\r
70                                 }else {\r
71                                         s=(cmax-cmin)*255/cmax;\r
72                                         int cdes=cmax-cmin;\r
73                                         //H成分を計算\r
74                                         if(cdes!=0){\r
75                                                 if(cmax==r){\r
76                                                         h=(g-b)*60/cdes;\r
77                                                 }else if(cmax==g){\r
78                                                         h=(b-r)*60/cdes+2*60;\r
79                                                 }else{\r
80                                                         h=(r-g)*60/cdes+4*60;\r
81                                                 }\r
82                                         }else{\r
83                                                 h=0;\r
84                                         }\r
85                                 }\r
86                                 if(h<0)\r
87                                 {\r
88                                         h+=360;\r
89                                 }\r
90                                 //hsv変換(h9s8v8)\r
91                                 out_buf[i]=(0x1ff0000&(h<<16))|(0x00ff00&(s<<8))|(cmax&0xff);\r
92                         }\r
93                         return;\r
94                 }\r
95         }       \r
96 }