使用imagefilter功能改变图像颜色

问题描述:

我使用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://*.com/questions/4902452/how-can-i-re- or-a-png-24-alpha-transparent-图片 - 机智 –

+0

好的,我会尝试这个。 – ankit

+0

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

我试过这个并且工作 - 主要是:)我将你的棕色图像保存为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