使用gd库在单色透明png中更改颜色

时间:2011-10-06 12:02:58

标签: php gd

我试图使用gd库重新着色一个颜色的png图像。我在另一个帖子中找到了一个代码,它将重新着色gif。我已修改该代码以使用透明png。这是我的代码。我可以使用此代码创建一个新的png文件,但颜色不会更改。请有人帮我改变透明色彩。

<?php
// first we will create a transparent image. an image that has no color.
$width = 300; $height=340;
$image = imagecreatetruecolor($width,$height); //black image of the specified width x height. 

imagealphablending($image, false);  // set blend mode to false.

$col=imagecolorallocatealpha($image,255,255,255,127); // fill color

imagefilledrectangle($image,0,0,$width,$height,$col); 

imagealphablending($image,true);


$shirt = imagecreatefrompng("shirt.png");
$color = imagecolorclosest ( $shirt,  255,0,0 ); 
imagecolorset($shirt,$color,92,92,92); // SET NEW COLOR

imagecopy($image, $shirt, 0, 0, 0, 0, $width, $height);

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

if(imagepng($image, "hello.png", 1)){
    echo "hello.png";
}
imagedestroy($image);
imagedestroy($shirt);

?>

1 个答案:

答案 0 :(得分:1)

我自己想出来,使用了一些人的代码并将它们组合在网站上,我不记得在哪里,因为我只是抓住并合并代码。

function updateThumb($image, $newColor) {
    $img = imagecreatefrompng($image);

    $w = imagesx($img);
    $h = imagesy($img);

    // Work through pixels
    for($y=0;$y<$h;$y++) {
        for($x=0;$x<$w;$x++) {
            // Apply new color + Alpha
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x, $y));

            $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
            imagesetpixel($img, $x, $y, $transparent);


            // Here, you would make your color transformation.
            $red_set=$newColor[0]/100*$rgb['red'];
            $green_set=$newColor[1]/100*$rgb['green'];
            $blue_set=$newColor[2]/100*$rgb['blue'];
            if($red_set>255)$red_set=255;
            if($green_set>255)$green_set=255;
            if($blue_set>255)$blue_set=255;

            $pixelColor = imagecolorallocatealpha($img, $red_set, $green_set, $blue_set, $rgb['alpha']);
            imagesetpixel ($img, $x, $y, $pixelColor);
        }
    }

    // Restore Alpha
    imageAlphaBlending($img, true);
    imageSaveAlpha($img, true);

    return $img;
}

function makeThumb($path, $top, $bottom=FALSE) {
    $width = imagesx($top);
    $height = imagesy($top);

    $thumbHeight = $bottom != FALSE ? $height * 2 : $height;

    // Create Transparent PNG
    $thumb = imagecreatetruecolor($width, $thumbHeight);
    $transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127);
    imagefill($thumb, 0, 0, $transparent);

    // Copy Top Image
    imagecopy($thumb, $top, 0, 0, 0, 0, $width, $height);

    // Copy Bottom Image
    if ($bottom != FALSE) {
        imagecopy($thumb, $bottom, 0, $height, 0, 0, $width, $height);
    }

    // Save Image with Alpha
    imageAlphaBlending($thumb, true);
    imageSaveAlpha($thumb, true);
    header('Content-Type: image/png');
    imagepng($thumb, $path); // save image as png

}

//the array is ur rgb recolor. array(red,green,blue) values 0-255
$thumbTop = updateThumb('input/path', array(240,105,15));