- 开发无止境 -
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 '灰色';
}
}
}
还是有一点点的误差率,毕竟颜色太接近的颜色每个人的评估标准是不一样的,但目前绝大多数图片都可以准确的判断分类,已经很满足了。