0

0

获取图片的色系和颜色值(十六进制)

PHP中文网

PHP中文网

发布时间:2016-05-23 08:39:10

|

2386人浏览过

|

来源于php中文网

原创

适用php环境,最好能够安装gm(graphicsmagick),速度比gd快很多

  1. pictureColor.class.php

    唱鸭
    唱鸭

    音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

    下载
colorName('E:\project\lumen\public\t.jpg');
 * echo $obj->hexName('E:\project\lumen\public\t.jpg');
 *
 * @author lock
 * @link https://github.com/lock-upme
 */
 
 
 
class pictureColor
{
    /**
     * GM Lib
     */
    public $gm = 'C:\Progra~1\GraphicsMagick-1.3.22-Q8\gm.exe';
     
    /**
     * 获取颜色使用库类型
     * gd or gm
     */
    public $type = 'gd';
     
    /**
     * 十六进制
     */
    public $hex = array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
     
    /**
     * 获得图片色系
     *
     * @param string $file
     * @return string
     */
    public function colorName($file) {
        if (empty($file)) { return false; }     
        $rgb = $this->getRGB($file, $this->type);
        $hsl = $this->RGB2HSL($rgb);     
        return $this->getColorName($hsl);
    }
     
    /**
     * 取得图片十六进制
     *
     * @param string $file
     * @return string
     */
    public function hexName($file) {
        if (empty($file)) { return false; }     
        $rgb = $this->getRGB($file, $this->type);
        return $this->RGB2Hex($rgb);
    }
     
    /**
     * 取得图片RGB
     *
     * @param string $file
     * @param string $type gd/gm
     * @return array
     */
    public function getRGB($file, $type='gd') {
        if (empty($file)) { return false; }
         
        if ($type == 'gd') {
            $filext = trim(strtolower(strrchr($file, '.')),'.');
            if ($filext == 'jpg' ||  $filext == 'jpeg') {
                $img = ImageCreateFromJpeg($file);
            } elseif ($filext == 'png') {
                $img = imagecreatefrompng($file);
            } elseif ($filext == 'bmp') {
                $img = imagecreatefromwbmp($file);
            } elseif ($filext == 'gif') {
                $img = imagecreatefromgif($file);
            }
            $w = imagesx($img);
            $h = imagesy($img);
            $r = $g = $b = 0;
            for($y = 0; $y < $h; $y++) {
                for($x = 0; $x < $w; $x++) {
                    $rgb = imagecolorat($img, $x, $y);
                    $r += $rgb >> 16;
                    $g += $rgb >> 8 & 255;
                    $b += $rgb & 255;
                }
            }
            $pxls = $w * $h;
             
            $r = (round($r / $pxls));
            $g = (round($g / $pxls));
            $b = (round($b / $pxls));
            /*
            $r = dechex (round($r / $pxls));
            $g = dechex (round($g / $pxls));
            $b = dechex (round($b / $pxls));
            return $r.$g.$b;
             */
            return array( '0' => $r, '1' => $g, '2' => $b );
             
        } elseif ($type == 'gm') {  
            //$cmd = $this->gm. " identify -verbose $file | grep Mean | awk -F' ' '{print $3}' | tr -d '()'";
            $cmd = $this->gm . " identify -verbose $file";
            $res = shell_exec($cmd);
            //print_r($res);
             
            preg_match_all('/Mean:\s+[0-9]+\.[0-9]+\s\((.*)\)/', $res, $match);
            //print_r($match);
            $rgb = $match[1];
             
            if (count($rgb) != 3) { //workaround{TODO:to be fixed}
                $rgb['2'] = $rgb['1'] = $rgb['0'];
            }
            while (list($key, $val) = each($rgb)) {
                $rgb[$key] = round($val * 255, 2);
            }
            return $rgb;
        }   
    }
     
    public function RGB2Hex($rgb) {
        $hexColor = '';
        $hex = $this->hex;
        for($i = 0; $i < 3; $i ++) {
            $r = null;
            $c = $rgb [$i];
            $hexAr = array ();
     
            while ( $c > 16 ) {
                $r = $c % 16;
                $c = ($c / 16) >> 0;
                array_push ( $hexAr, $hex [$r] );
            }
            array_push ( $hexAr, $hex [$c] );
     
            $ret = array_reverse ( $hexAr );
            $item = implode ( '', $ret );
            $item = str_pad ( $item, 2, '0', STR_PAD_LEFT );
            $hexColor .= $item;
        }
        return $hexColor;
    }
     
    /**
     * RGB转HSL
     *
     * @param array $rgb
     * @return array
     */
    public function RGB2HSL($rgb) {
        list($r, $g, $b) = $rgb;
        $r /= 255;
        $g /= 255;
        $b /= 255;
        $max = max($r, $g, $b);
        $min = min($r, $g, $b);
        $delta = $max - $min;
        $l = ($max + $min) / 2;
     
        if ($delta == 0) {
            $h = 0;
            $s = 0;
        } else {
            $s = ($l < 0.5) ? $delta / ($max + $min) : $delta / (2 - $max - $min);
     
            $deltar = ((($max - $r) / 6) + ($max / 2)) / $delta;
            $deltag = ((($max - $g) / 6) + ($max / 2)) / $delta;
            $deltab = ((($max - $b) / 6) + ($max / 2)) / $delta;
     
            if ($r == $max) {
                $h = $deltab - $deltag;
            } else if ($g == $max) {
                $h = (1 / 3) + $deltar - $deltab;
            } else if ($b == $max) {
                $h = (2 / 3) + $deltag - $deltar;
            }
            $h += ($h < 0) ? 1 : ($h > 1 ? -1 : 0);
        }
        return array($h * 360, $s * 100, $l * 100);
    }
     
    /**
     * HSL对应颜色名称
     *
     * @param array $hsl
     * @return string
     */
    public function getColorName($hsl) {
        $colorarr = array(
                '0, 100, 50' => '红色',
                '30, 100, 50' => '橙色',
                '60, 100, 50' => '黄色',
                '120, 100, 75' => '绿色',
                '240, 100, 25' => '蓝色',
                '300, 100, 25' => '紫色',
                '255, 152, 191' => '粉红',
                //'136, 84, 24' => '棕色',
                '0, 0, 50' => '灰色',
                '0, 0, 0' => '黑色',
                '0, 0, 100' => '白色',
        );
        $distarr = array();
        foreach ($colorarr as $key => $val) {
            list($h, $s, $l) = explode(',', $key);
            $distarr[$key] = pow(($hsl['0'] - $h), 2) + pow(($hsl['1'] - $s), 2) + pow(($hsl['2'] - $l), 2);
        }
        asort($distarr);
        list($key) = each($distarr);
        return $colorarr[$key];
    }
     
}

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号