James Thompson
James Thompson

Reputation: 1027

PHP GIF/PNG True Colorize Filter that Preserves Luminosity and Alpha

I've been working on a script for a while now to change the colors of GIF and PNG files that works better than the PHP colorize filter, which doesn't preserve luminosity. I've come up with this, but it doesn't quite work right:

$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);

Upvotes: 3

Views: 1783

Answers (2)

Mike C
Mike C

Reputation: 1778

Sounds like you want a tinted grayscale. This supports transparency...

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

Upvotes: 4

CrazyMax
CrazyMax

Reputation: 801

Try with these functions after $im = imagecreatefrompng($filename);

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

And use imagecreatetruecolor() :

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

Upvotes: -1

Related Questions