phpgdlib

Image color not change proper using imagefilter function


I am using imagefilter function for changing the image color. But the problem is a function not change in color what I want and the result image color is the addition of old image color and new image color. This is my original image

enter image description here

and I want to change this image color in enter image description here

but they convert like this enter image description here

Here is my code

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

when i check image function is actualy add oldimage value and given value 103,55,32 + 0,128,64 =103,183,96 which is my new image color value.

can any one help me what is going wrong?


Solution

  • I tried this and worked - mostly :) I saved your brown image as 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 />