2011-10-06 52 views
1

我嘗試使用gd庫重新着色單色png圖像。我在另一篇文章中發現了一個代碼,它會重新着色gif。我修改了該代碼以使用透明png。這是我的代碼。我可以用這段代碼創建一個新的png文件,但顏色不會改變。請有人幫我改變透明PNG的顏色。使用gd libarary在單一顏色透明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

就想通了這一點我自己,用幾個人的代碼,並結合他們的網站上,我不記得在哪裏,因爲我只是不停地掠奪和合並代碼。

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