使用php+imagick扩展 来获取图片主色调
引子
做为一个野路子的程序员, 看到其他app上的一些功能点 总爱去试试
前两天在用快手的app, 发现视频列表展示的图片在还没加载出来的时候
不像通常做法放一个默认的背景图, 而是用了一个纯色背景
等图片加载出来时候 发现纯色背景跟图片颜色很接近
尝试
个人感觉像是使用了 图片主色调或者图片 点最多的颜色值
实现思路最开始是 遍历整幅图片(或者通过获取图片颜色直方图,然后遍历直方图), 将每个点颜色进行记录 然后进行获取颜色值最多的,或者平均值之类
但是发现一张图片运行下来需要很长时间
代码
经过尝试, php + imagick 有方法可以直接提取主色调, 记录
$image = new \Imagick($file); //$file 图片存储地址或者url地址
$image->quantizeImage(1, \Imagick::COLORSPACE_RGB, 0, false, false); //获取到只剩1个颜色值, 也可以多取几个
$image->uniqueImageColors();
$iter = $image->getPixelIterator();
$iter->resetIterator();
$row = $iter->getNextIteratorRow();
$color = $row[0]->getColor(); //获取到第一个颜色点的颜色
echo $color['r'];
echo $color['g'];
echo $color['b'];
简单的处理, 就可以得到 近似主观主色调的颜色了.
产品上使用的时候 可以通过调整颜色的饱和度或者亮度 来让颜色更利于展示
效果对比
扒取了快手的数据 效果对比:
快手具体使用的什么方法就不知道了.
不过这个简单的方法可以用在一些简单的场景, 对于量级不是很大的地方完全ok
输出颜色名称
获取到颜色值 感觉还不够,主色到底是 红色,蓝色,黑色 还是神马的。得描述出来
颜色rgb来对应颜色名称, 0-255,0-255,0-255 有N多中组合
这里尝试 利用HSL值 来区分颜色名称 $hsl = $row[0]->getHSL();