最近做项目用到了php来获取用户图片的主色调
获取主色调 大概有两种,一种是获取色值最多的颜色来作为主色调,一种是使用图片所有颜色的平均值来作为主色调,经过对比,我们在这个地方 选用了 最多的颜色值 来做主色调。
那么,便开始获取呗。
开始的思路是 遍历整幅图片(或者通过获取图片颜色直方图,然后遍历直方图),将颜色记录到数组中, 根据容差 将相近的颜色合并, 并得到颜色的数目 根据颜色的数目排序,得到 颜色数目最多的几种颜色,
貌似处理有点慢,时间等待有点久...
后来,找到了一种方法,速度相对于上边那种快了不少, 暂时先用着了,以后再发现更好的了。可以换
处理方法贴上
实验:
$average = new Imagick('图片地址');
$average->quantizeImage( 2, Imagick::COLORSPACE_RGB, 0, false, false ); // 这个里边的2表示获取 2个较多的颜色,1的话就是1个主要色调,这样
$average->uniqueImageColors();
$colorarr = array();
$it = $average->getPixelIterator();
$it->resetIterator();
while( $row = $it->getNextIteratorRow() ){
foreach ( $row as $pixel ){
$colorarr[] = $pixel->getColor();
}
}
foreach($colorarr as $val){
echo "<div style='background-color: rgb({$val['r']},{$val['g']},{$val['b']});width:50px;height:50px;float:left;'>
}
根据代码看出, 实际上颜色遍历是把 原图通过方法变为了 x * 1的图片, x为你想得到的颜色数目,,所以遍历中 只循环了x次。
到现在 较多值的 颜色 获取到了。
但是在这次项目中需求不是要得到 rgb值,而是主色是什么颜色,比如 红色,蓝色,黑色神马的
那么又开始考虑吧,根据获取到的rgb来对应颜色不就可以了。。。擦,,rgb值 0-255,0-255,0-255,好多组合,烦,求其他方法
好,方法来了:
这样 在上边的程序中 改为获取 HSL值的方法 (imagickpixel 提供了获取的方法 ),从while那里修改
while( $row = $it->getNextIteratorRow() ){
foreach ( $row as $pixel ){
$colorarr[] = $pixel->getColor();
$hslarr[] = $pixel->getHSL(); //获取hsl
}
}
获取到hsl后,便可根据h s l的值 很方便的判断出颜色, 参考:http://www.360doc.com/content/12/0411/13/3764603_202744651.shtml
结果:
原图:
输出结果:
记录到这里,以后用,或者找到更好方法替换它