php使用Imagick获取图片主色调

最近做项目用到了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

结果:

原图:/aaaaa./


输出结果:

/bbbbb./

记录到这里,以后用,或者找到更好方法替换它

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值