理论上说,凡是调色板中出现的颜色都在图片上有应用,除非设计者在后期修改了图片red, green and blue are ranges 0->100 这里是强度,而非你理解的最大的支持颜色数目function ImageSelectiveColor($im,$red,$green,$blue) { for($i=0;$i<imagecolorstotal($im);$i++) { $col=ImageColorsForIndex($im,$i); $red_set=$red/100*$col['red']; $green_set=$green/100*$col['green']; $blue_set=$blue/100*$col['blue']; if($red_set>255)$red_set=255; if($green_set>255)$green_set=255; if($blue_set>255)$blue_set=255; imagecolorset($im,$i,$red_set,$green_set,$blue_set);
由于gif可以存在局部调色板,所以在多帧的情况下可以有超出256的颜色数
目前php的gd只支持单帧的gif图片我不知道你想干什么?如果只是想知道已使用的调色板所占空间,那么可以
$n = imagecolorstotal($im); //45
echo pow(2, ceil(log($n, 2))); //64 实际使用64×3字节
不过这有什么意义呢?
if (isset($_GET['color']) && preg_match ("/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i", $_GET['color'], $matches)) {
$r=hexdec($matches[1]); $g=hexdec($matches[2]); $b=hexdec($matches[3]);
}echo pack('H*','ffffff');$rx=($R-$r)/66;
$gx=($G-$g)/66;
$bx=($B-$b)/66;
for($i=1;$i<=65;$i++){
echo pack('C*', round($R-$rx*$i), round($G-$gx*$i), round($B-$bx*$i));
}echo pack('C*', $r, $g, $b);
这个是一个写死了点gif文件颜色处理过程。我现在想实现的是所有gif文件都能支持变色
2、调色板中的颜色以创建颜色时的顺序排列,不能认为其呈现某种规律
3、关于批量修改颜色,你可以参考手册中 imagecolorset 函数的示例
4、如果你想脱离gd自行编程完成(似乎你的示例反映了这点),那么你就必须自行编程分析gif文件,并对相应的全局或局部调色板进行处理
2.我现在想要找的就是这样的一个规律,首先图片不可能是单色的,要将这图片变成某个色调需要用什么方法来处理,这个问题就是我在处理这个需求的时候要不太清楚的地方,所以才有先想用4楼的方法对颜色进行处理。才会需要得到图片支持的最大颜色数。 当然我的思路不太正确,让您比较不好想象,所以这里请兄弟帮忙下看看变色这个需求这样处理是否合适,或者什么方式更好?
3.imagecolorset 这个地方的对颜色的处理
$col=ImageColorsForIndex($im,$i);
$red_set=$red/100*$col['red'];
$green_set=$green/100*$col['green'];
$blue_set=$blue/100*$col['blue'];
if($red_set>255)$red_set=255;
if($green_set>255)$green_set=255;
if($blue_set>255)$blue_set=255;
imagecolorset($im,$i,$red_set,$green_set,$blue_set);
这地方我也是有去看了下,但是这个处理方式也是有这方面的问题, $red_set=$red/100*$col['red']; 这句的100应该是换成最大的支持颜色数目,才能保持原图的色彩分辨啊,不知道我的理解是否正确;
4.上面的例子只是我们一前台js程序员写的,具体处理的话我肯定还是用gd库。按我之前的思路,就是这个最大支持的颜色数目不好直接求的。
{
for($i=0;$i<imagecolorstotal($im);$i++)
{
$col=ImageColorsForIndex($im,$i);
$red_set=$red/100*$col['red'];
$green_set=$green/100*$col['green'];
$blue_set=$blue/100*$col['blue'];
if($red_set>255)$red_set=255;
if($green_set>255)$green_set=255;
if($blue_set>255)$blue_set=255;
imagecolorset($im,$i,$red_set,$green_set,$blue_set);
}
return $im;
}
这个函数是将图片中原有的颜色按指定的比例进行修改
$im = ImageSelectiveColor($im, 100, 100, 100); //颜色不发生变化
$im = ImageSelectiveColor($im, 100, 0, 0); //只保留红色成分代码中出现的255也不是颜色数目,而是带字节整数的上限另外请注意:由于gif的调色板中用一个字节保存一种颜色分量,所以gif的颜色深度只有255
具体需求是页面上用户选择一个颜色,则图片应该就根据这个颜色进行变色处理。
我以前的思路就是把这里的$red_set=$red/100*$col['red'];公式换成(red_set=$red/$col['red']*调色板最大颜色数目),这样是否更可以保持原图色彩之间的差异度。