- 开发无止境 -
Data: 2014-06-01 01:35:59Form: JournalClick: 11
最近很火的egale图片管理工具里头有个入库图片颜色自动分类的功能。可以快速在一堆图里头按照颜色进行图片筛选,非常好用!我也想给我的图库也增加这个功能。同样是开始代码构思,我先要获取图片的颜色再把颜色进行计算。开始入手制作时感觉挺简单的,只要获取颜色、按照分类、入库完事。
网上有个好用的组件叫color-thief可以获取图片的RGB值,我用composer加载好导入生成的autoload.php文件就算加载好color-thief组件啦,使用方法如下
$palette = ColorThief::getPalette(图片地址, 获取颜色数量上线, 按照多少像素平均值来计算[即提取精度1像素为最高,精度越高越卡]);
返回结果:
Array( [0]=>Array ( [0]=>115 [1]=>60 [2]=>166 ) )
现在颜色参数有了,开始数据分类时发现了难点,因为RGB三原色比较复杂,算法会难以计算,寻思把颜色转换成HSV模式会比较好运算,利用网上找的包进行转换下载颜色转换包,使用方法:
//转换颜色模式 require_once './hsl/RBG.php'; $HSV = new RGB(红,绿,蓝);//导入刚才获得的RGB值 $HSV=$HSV->toHSV(); $HSV=(array)$HSV; $HSV_h=round($HSV["*_hue"]); $HSV_s=round($HSV["*_saturation"]*100); $HSV_v=round($HSV["*_value"]/255*100);
这样我们就得到了RGB转换好的HSV颜色值,剩下的就好办了。饱和度跟亮度太低的就是黑白灰无颜色图片,有颜色的部分在判断色相就可以得到颜色,代码如下:
//以hsv模式判断颜色 function is_colors($h,$s,$v) { //误差率2% if($s>=15 && $v>=25){ //有饱和度&有亮度 =有颜色 if(($h>=0 && $h<=20) || ($h>310 && $h<=360)){ //红色 return '红色'; }elseif($h>20 && $h<=35){ //橙色 return '橙色'; }elseif($h>35 && $h<=75){ //黄色 return '黄色'; }elseif($h>75 && $h<=160){ //绿色 return '绿色'; }elseif($h>160 && $h<=200){ //青色 return '青色'; }elseif($h>200 && $h<=260){ //蓝色 return '蓝色'; }elseif($h>260 && $h<=310){ //紫色 return '紫色'; } }else{ //判断黑白灰 if($v>90){ //白色 return '白色'; }else if($v<25){ //黑色 return '黑色'; }else{ //灰色 return '灰色'; } } }
还是有一点点的误差率,毕竟颜色太接近的颜色每个人的评估标准是不一样的,但目前绝大多数图片都可以准确的判断分类,已经很满足了。