PHP获取一张图片的主要颜色

PHP获取一张图片的主要颜色

<?php

echo getMainColor('https://cn.bing.com/th?id=OHR.AbuSimbelSunFest_EN-CN8625936842_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp');
//输出rgb(103, 54, 12)

echo getMainColor('https://cn.bing.com/th?id=OHR.AbuSimbelSunFest_EN-CN8625936842_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp',1);
//输出#67360c

/**
 * 获取一张图片的主要颜色
 * @param string $imgUrl 图片的本地路径或者在线路径
 * @param boolean $isHex 是否获取16进制的主要颜色
 */
function getMainColor($imgUrl,$isHex=false) {
    $imageInfo = getimagesize($imgUrl);
    //图片类型
    $imgType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
    //对应函数
    $imageFun = 'imagecreatefrom' . ($imgType == 'jpg' ? 'jpeg' : $imgType);
    $i = $imageFun($imgUrl);
    //循环色值
    $rColorNum=$gColorNum=$bColorNum=$total=0;
    for ($x=0;$x<imagesx($i);$x++) {
        for ($y=0;$y<imagesy($i);$y++) {
            $rgb = imagecolorat($i,$x,$y);
            //三通道
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            $rColorNum += $r;
            $gColorNum += $g;
            $bColorNum += $b;
            $total++;
        }
    }
    $rgb = array();
    $r = round($rColorNum/$total);
    $g = round($gColorNum/$total);
    $b = round($bColorNum/$total);
    if($isHex){
        return rgb2Hex($r, $g, $b);
    }
    return "rgb($r, $g, $b)";
}

/**
 * RGB颜色转16进制颜色
 * @param int|array $r
 * @param int $g
 * @param int $b
 */
function rgb2Hex($r, $g=-1, $b=-1)
{
    if (is_array($r) && sizeof($r) == 3)
        list($r, $g, $b) = $r;
    $r = intval($r); $g = intval($g);
    $b = intval($b);
    $r = dechex($r<0?0:($r>255?255:$r));
    $g = dechex($g<0?0:($g>255?255:$g));
    $b = dechex($b<0?0:($b>255?255:$b));
    $color = (strlen($r) < 2?'0':'').$r;
    $color .= (strlen($g) < 2?'0':'').$g;
    $color .= (strlen($b) < 2?'0':'').$b;
    return "#$color";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值