代码之家  ›  专栏  ›  技术社区  ›  James Thompson

PHP GIF/PNG真彩色滤镜,保持亮度和α

  •  3
  • James Thompson  · 技术社区  · 14 年前

    我已经做了一段时间的脚本来改变GIF和PNG文件的颜色,这比PHP颜色过滤器更好,后者不能保持亮度。我想出来了,但效果不太好:

    $filename = "images/sprites/".$_GET['sprite'].".png";
        $im = imagecreatefrompng($filename);
        $nim = imagecreate( imagesx($im), imagesy($im) );
        $background = imagecolorallocate($nim, 255, 0, 255);
    
        $size = getimagesize($filename);
    
        for($y = 0; $y < imagesy($nim); $y++) {
            for($x = 0; $x < imagesx($nim); $x++) {
                $rgb = imagecolorat($im, $x, $y);
                $colors = imagecolorsforindex($im, $rgb);
                $mods = explode("x",$_GET['color']);
    
                $colors['red']   = ($colors['red'] / 8 + (255 - ((255 - $mods[0] - $colors['red']) * 2))) / 2;
                $colors['green'] = ($colors['red'] / 8 + (255 - ((255 - $mods[1] - $colors['green']) * 2))) / 2;
                $colors['blue']  = ($colors['red'] / 8 + (255 - ((255 - $mods[2] - $colors['blue']) * 2))) / 2;
    
                $r = $colors['red'];
                $g = $colors['green'];
                $b = $colors['blue'];
    
                if($r < 0) $r = 0;
                if($g < 0) $g = 0;
                if($b < 0) $b = 0;
                if($r > 255) $r = 255;
                if($g > 255) $g = 255;
                if($b > 255) $b = 255;
    
                if(!isset($color[$r.$g.$b])) {
                    $color[$r.$g.$b] = imagecolorallocate($nim, $r, $g, $b);
                }
    
                imagesetpixel($nim, $x, $y, $color[$r.$g.$b]);
            }
        }
    
        imagecolortransparent($nim, 1);
        header('Content-Type: image/png');
        imagepng($nim);
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Mike C    14 年前

    听起来你想要一个彩色的灰度。这支持透明度。。。

    http://www.exorithm.com/algorithm/view/duotone_image

        2
  •  -1
  •   CrazyMax    14 年前

    在之后尝试这些功能 $im = imagecreatefrompng($filename);

    imagealphablending($im, false);
    imagesavealpha($im, true);
    

    并使用imagecreatetruecolor():

    $nim = imagecreatetruecolor ( imagesx($im), imagesy($im) );