<?php
$image = imagecreatetruecolor(80, 80);
$backColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
//填充背景色
imagefill($image, 0, 0, $backColor);
header('Content-Type:image/png');
imagepng($iamge);
imagedestroy($image);
?>
上面的代码会在浏览器输出一张宽80px、高80px的png格式的图片其 中: $backColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)), 这是创建背景色的一段代码。没刷新一次浏览器,图片背景会是不一样的颜色。其中用到了RGB色彩模式。
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色。(来自百度百科http://baike.baidu.com/link?url=uvG90p_6pCXA_ivLp89BECgSfcBGFiZfINsRmM5H1i3Jc7X9Fmhdbus_fT-d-1vW)
于是就有一个问题,比如在做验证吗的图片时,如果随机生成背景颜色,在此颜色上显示随机的字符,如何尽量让图片的的背景是浅色或淡的颜色。于是查了资料,可以根据RGB去调相应的颜色。
但单纯通过颜色值的RGB值不能够得知颜色的深浅,简单的R+G+B判断是不可取的。上网搜索之后得知可以使用YUV颜色编码来判断颜色的深浅。
Y'UV的发明是由于彩色电视与黑白电视的过渡时期[1]。黑白视讯只有Y(Luma,Luminance)视讯,也就是灰阶值。到了彩色电视规格的制定,是以YUV/YIQ的格式来处理彩色电视图像,把UV视作表示彩度的C(Chrominance或Chroma),如果忽略C信号,那么剩下的Y(Luma)信号就跟之前的黑白电视信号相同,这样一来便解决彩色电视机与黑白电视机的相容问题。Y'UV最大的优点在于只需占用极少的带宽。彩色图像记录的格式,常见的有RGB、YUV、CMYK等。 彩色电视最早的构想是使用RGB三原色来同时传输。这种设计方式是原来黑白带宽的3倍,在当时并不是很好的设计。RGB诉求于人眼对色彩的感应,YUV则 着重于视觉对于亮度的敏感程度,Y代表的是亮度,UV代表的是彩度(因此黑白电影可省略UV,相近于RGB),分别用Cr和Cb来表示,因此YUV的记录 通常以Y:UV的格式呈现。(来自维基百科 http://zh.wikipedia.org/wiki/YUV)
根据网上查找的色彩心理学公式:
$colorLevel = $r * 0.299 + $g * 0.587 + $b * 0.114;
所以我们可以通过$grayLevel来判断此颜色的深浅,$grayLevel的值越小,则颜色越深。