2016-07-06 59 views
2

我使用imagefilter函數改變圖像顏色。但問題是一個功能不會改變我想要的顏色,結果圖像顏色是舊圖像顏色和新圖像顏色的添加。這是我原來的圖像使用imagefilter功能改變圖像顏色

enter image description here

,我想改變enter image description here

這個圖像顏色,但它們將像這樣 enter image description here

這裏是我的代碼

header('Content-Type: image/png'); 
$image = imagecreatefrompng('a400-d58.png'); 
imagefilter($image, IMG_FILTER_COLORIZE, 0, 128, 64); 
imagealphablending($image, true); 
imagesavealpha($image, true); 
imagepng($image,'a400-d585.png'); 

當我檢查圖像功能是實際添加oldimage值並給出值 103,55,32 + 0,128,64 = 103,183,96這是我的新圖像顏色值。

任何人都可以幫助我什麼是錯的?

+0

看看這個 - http://stackoverflow.com/questions/4902452/how-can-i-re- or-a-png-24-alpha-transparent-圖片 - 機智 –

+0

好的,我會嘗試這個。 – ankit

+0

不是@Thair,它不工作。 – ankit

回答

1

我試過這個並且工作 - 主要是:)我將你的棕色圖像保存爲img1.png。

 <?php 

    function colorizeKeepAplhaChannnel($inputFilePathIn, $targetRedIn, $targetGreenIn, $targetBlueIn, $outputFilePathIn) { 
     $im_src = imagecreatefrompng($inputFilePathIn); 
     $im_dst = imagecreatefrompng($inputFilePathIn); 
     $width = imagesx($im_src); 
     $height = imagesy($im_src); 

     // Note this: FILL IMAGE WITH TRANSPARENT BG 
     imagefill($im_dst, 0, 0, IMG_COLOR_TRANSPARENT); 
     imagesavealpha($im_dst,true); 
     imagealphablending($im_dst, true); 


     $flagOK = 1; 
     for($x=0; $x<$width; $x++) { 
      for($y=0; $y<$height; $y++) { 
       $rgb = imagecolorat($im_src, $x, $y); 

       $colorOldRGB = imagecolorsforindex($im_src, $rgb); 
       $alpha = $colorOldRGB["alpha"]; 

       //echo "$colorOldRGB[red], $colorOldRGB[green],$colorOldRGB[blue] <br/>\n"; 

       if($colorOldRGB["red"] >150 && $colorOldRGB["green"] >150 && $colorOldRGB["blue"] >150) { 
        $newRed = $colorOldRGB["red"]; 
        $newGreen = $colorOldRGB["green"]; 
        $newBlue = $colorOldRGB["blue"]; 

       } 
       else if($colorOldRGB["red"] === 0 && $colorOldRGB["green"] === 0 && $colorOldRGB["blue"] === 0) { 
        $newRed = 0; 
        $newGreen = 0; 
        $newBlue = 0;   
       } 
       else { 
//     $newRed = 0 - $colorOldRGB["red"] + $targetRedIn; 
//     $newGreen =0 - $colorOldRGB["green"] + $targetGreenIn; 
//     $newBlue = 0 - $colorOldRGB["blue"] + $targetBlueIn; 


        $newRed = $targetRedIn; 
        $newGreen = $targetGreenIn; 
        $newBlue = $targetBlueIn; 

       } 


       if($newRed <0) { 
        $newRed = 0; 
       } 
       if($newRed >255) { 
        $newRed = 255; 
       } 

       if($newGreen <0){ 
        $newGreen = 0; 
       } 
       if($newGreen>255) { 
        $newGreen = 255; 
       } 

       if($newBlue<0) { 
        $newBlue = 0; 
       } 
       if($newBlue>255) { 
        $newBlue = 255; 
       } 




       //$colorNew = imagecolorallocatealpha($im_src, $targetRedIn, $targetGreenIn, $targetBlueIn, $alpha); 
       $colorNew = imagecolorallocatealpha($im_src, $newRed, $newGreen, $newBlue, $alpha); 

       $flagFoundColor = true; 
       // uncomment next 3 lines to substitute only 1 color (in this case, BLACK/greys) 
    /* 
       $colorOld = imagecolorallocatealpha($im_src, $colorOldRGB["red"], $colorOldRGB["green"], $colorOldRGB["blue"], 0); // original color WITHOUT alpha channel 
       $color2Change = imagecolorallocatealpha($im_src, 0, 0, 0, 0); // opaque BLACK - change to desired color 
       $flagFoundColor = ($color2Change == $colorOld); 
    */ 

       if (false === $colorNew) { 
        //echo("FALSE COLOR:$colorNew alpha:$alpha<br/>"); 
        $flagOK = 0; 
       } else if ($flagFoundColor) { 
        imagesetpixel($im_dst, $x, $y, $colorNew); 
        //echo "x:$x y:$y col=$colorNew alpha:$alpha<br/>"; 
       } 
      } 
     } 
     $flagOK2 = imagepng($im_dst, $outputFilePathIn); 

     if ($flagOK && $flagOK2) { 
      echo ("<strong>Congratulations, your conversion was successful </strong><br/>new file $outputFilePathIn<br/>"); 
     } else if ($flagOK2 && !$flagOK) { 
      echo ("<strong>ERROR, your conversion was UNsuccessful</strong><br/>Please verify if your PNG is truecolor<br/>input file $inputFilePathIn<br/>"); 
     } else if (!$flagOK2 && $flagOK) { 
      $dirNameOutput = dirname($outputFilePathIn)."/"; 
      echo ("<strong>ERROR, your conversion was successful, but could not save file</strong><br/>Please verify that you have PERMISSION to save to directory $dirName <br/>input file $inputFilePathIn<br/>"); 
     } else { 
      $dirNameOutput = dirname($outputFilePathIn)."/"; 
      echo ("<strong>ERROR, your conversion was UNsuccessful AND could not save file</strong><br/>Please verify if your PNG is truecolor<br/>Please verify that you have PERMISSION to save to directory $dirName <br/>input file $inputFilePathIn<br/>"); 
     } 

     echo ("TargetName:$outputFilePathIn wid:$width height:$height CONVERTED:|$flagOK| SAVED:|$flagOK2|<br/>"); 
     imagedestroy($im_dst); 
     imagedestroy($im_src); 
    } 

    $targetRed = 0; 
    $targetGreen = 128; 
    $targetBlue = 64; 

    //$inputFileName = 'frameSquareBlack_88x110.png'; 
    $inputFileName = 'img1.png'; 
    $dirName = "./images/"; 
    $nameTemp = basename($inputFileName, ".png"); 
    $outputFileName = $nameTemp."_$targetRed"."_$targetGreen"."_$targetBlue.png"; 
    $inputFilePath = $dirName.$inputFileName; 
    $outputFilePath = $dirName.$outputFileName; 

    //echo "inputFileName:$inputFilePath<br>outputName:$outputFilePath<br>"; 
    colorizeKeepAplhaChannnel($inputFilePath, $targetRed, $targetGreen, $targetBlue, $outputFilePath); 
    ?> 
    <br/><br/> 
    Original <br/> 
    <img src="<?php echo $inputFilePath; ?>"> 
    <br /><br />Colorized<br/> 
    <img src="<?php echo $outputFilePath; ?>"> 
    <br /> 
+0

但他們不按照我的意願轉換。在中間部分的白色部分中呈現棕色圖像,當我們轉換它們時,它們轉換所有圖像。 – ankit

+0

嘗試將白色部分轉換爲原始圖像中的透明部分。不知道這是否會起作用。 –

+0

不,我們不能讓它們透明,因爲它們是我們需要的。 – ankit