2016-07-06 3 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-replace-one-color-with-another-in-a-png-24-alpha-transparent- image-wit –

+0

나는 이것을 시도 할 것이다. – ankit

+0

아니요 @ T.Shah 작동하지 않습니다. – 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

관련 문제