不是取得图片已使用的索引数目imagecolorstotal     (),而是比如最大支持128的就返回128,最大支持256的就返回256,B&G好久,好像是没有现成的函数,难不成要去分析gif数据结构?有了解的兄弟帮帮忙

解决方案 »

  1.   

    gif的调色板最大支持256色,这是gif文件格式规范。
      

  2.   

    知道啊,应该是有的gif是最大支持256,但是有些本身是128及64的吧,现在我就想获得某个gif所支持的最大颜色
      

  3.   

    我描述下我的需求,兄弟们帮忙确认下。我现在要做的是根据传入的颜色值,对某个gif图片进行变色处理。比如传入的颜色是#888888,则对gif的调色板各个索引的颜色值都进行一定的处理。这个处理目前是这样考虑的,根据图片本身的最大支持颜色,分别对每个索引rgb三色按照传入颜色的rgb值除以索引rgb三色的值,再乘以最大支持的颜色,这样来得到最后这个索引需要得到的颜色值。不知道有没有说清楚,大家帮忙看下
      

  4.   

    那不就是 imagecolorstotal -- 取得一幅图像的调色板中颜色的数目 吗?
      

  5.   

    imagecolorstotal    这个函数取得的不是只是该gif所使用的颜色索引数目吗。gif文件可能他支持256,但是并不是每个索引都已经使用上吧?我测试的时候某个文件imagecolorstotal()返回的是45
      

  6.   

    对 imagecolorstotal 指已使用的颜色数,<=256在gif文件的第11个字节的后3位保存有该gif文件所使用的全局调色板的大小(2的乘方的指数)
    由于gif可以存在局部调色板,所以在多帧的情况下可以有超出256的颜色数
    目前php的gd只支持单帧的gif图片我不知道你想干什么?如果只是想知道已使用的调色板所占空间,那么可以
    $n = imagecolorstotal($im); //45
    echo pow(2, ceil(log($n, 2))); //64 实际使用64×3字节
    不过这有什么意义呢?
      

  7.   

    我现在想实现的就是gif文件的变色,传入红色,那么则对该文件调色板内所有颜色根据传入的颜色及最大颜色之间的关系进行处理,确定某个索引最后需要修改成的颜色。不知道这样的变色方案是否可行,兄弟能不能帮忙指导下。
    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文件都能支持变色
      

  8.   

    1、处理范围只到 imagecolorstotal ,其后的颜色并没有被使用
    2、调色板中的颜色以创建颜色时的顺序排列,不能认为其呈现某种规律
    3、关于批量修改颜色,你可以参考手册中 imagecolorset 函数的示例
    4、如果你想脱离gd自行编程完成(似乎你的示例反映了这点),那么你就必须自行编程分析gif文件,并对相应的全局或局部调色板进行处理
      

  9.   

    1.这点我清楚,就算是调色板中的颜色也不一定在图片上都有应用到吧?
    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库。按我之前的思路,就是这个最大支持的颜色数目不好直接求的。
      

  10.   

    理论上说,凡是调色板中出现的颜色都在图片上有应用,除非设计者在后期修改了图片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); 
       
       } 
      return $im; 
      
     } 
    这个函数是将图片中原有的颜色按指定的比例进行修改
    $im = ImageSelectiveColor($im, 100, 100, 100); //颜色不发生变化
    $im = ImageSelectiveColor($im, 100, 0, 0); //只保留红色成分代码中出现的255也不是颜色数目,而是带字节整数的上限另外请注意:由于gif的调色板中用一个字节保存一种颜色分量,所以gif的颜色深度只有255
      

  11.   

    恩,我看手册的时候有点粗心了,不过这种说法,如果按照百分比的话也是不合适我目前的需求。
    具体需求是页面上用户选择一个颜色,则图片应该就根据这个颜色进行变色处理。
    我以前的思路就是把这里的$red_set=$red/100*$col['red'];公式换成(red_set=$red/$col['red']*调色板最大颜色数目),这样是否更可以保持原图色彩之间的差异度。