Jump to content

Recommended Posts

Firstly, if there's a GD forum, I couldn't find it, so please accept my apologies!

 

I've written a fairly standard function to greyscale a jpg image. When I adapted it to do the same for png or gif (non-animated) formats, using switch to open and create the files according to their type, the images came out very dark although the jpg still came out OK. I'm new to the GD image functions and don't know why this happens. Am I missing something very obvious?

 

The main guts of the function is as follows :

 

<?php
  //get source file 
  switch($filetype)
    {case "jpg"  :
     case "jpeg" :
       $source = imagecreatefromjpeg($filename); 
       break;
     case "png"  :
       $source = imagecreatefrompng($filename); 
       break;
     case "gif"  :
       $source = imagecreatefromgif($filename); 
       break;               
     default :
       echo "Unrecognised file type - unable to get source file<br />";
       break; 
     }
   
   //get file info and create target
   $size   = getimagesize($filename);
   $width  = $size[0];
   $height = $size[1];
   
   //template image
   $target = imagecreate($width,$height);

   //create palette for template image
   for ($x=0;$x<256;$x++)
     {
      $palette[$x] = imagecolorallocate($target,$x,$x,$x);
     }

   //scan image and update target
   for ($x=0;$x<$width;$x++) 
     {
      for ($y=0;$y<$height;$y++) 
        {
         //get the pixel rgb values
         $rgb = imagecolorat($source,$x,$y);
         $r = $rgb >> 16 & 0xFF;
         $g = $rgb >> 8  & 0xFF;
         $b = $rgb       & 0xFF;
         
         //convert to greyscale value
         $grey = (($r*0.299)+($g*0.587)+($b*0.114)); 
         
         //set the pixel     
         imagesetpixel($target,$x,$y,$palette[$grey]);
        }
     }

   //create a new image file 
   switch($filetype)
     {case "jpg"  :
      case "jpeg" :
        imagejpeg($target,$newfile); 
        break;
      case "png"  :
        imagepng($target,$newfile); 
        break;
      case "gif"  :
        imagegif($target,$newfile); 
        break;  
      default :
        echo "Unrecognised file type - unable to generate file<br />";
        break; 
      }
?>

Link to comment
https://forums.phpfreaks.com/topic/62582-solved-greyscaling-a-pnggif-image/
Share on other sites

There's nothing I see in your code that could really make the image darker on GIFs... All I can guess is that it has something to do with the palettes, but it seems like you've handled most of that.

A quick thing, though: When you access $palette using the $grey value, be sure you cast it to an int ($grey=(int)...;) so it goes to the integer index instead of possibly going to an associative index of floating-point type.

I've solved the problem, but I don't understand why it's there in the first place, as everybody seems to think the original code should work.

I've posted what I did in case it helps anybody else.

 

Original code (only works properly for JPG files):

$rgb = imagecolorat($source,$x,$y);
$r = $rgb >> 16 & 0xFF;
$g = $rgb >> 8  & 0xFF;
$b = $rgb       & 0xFF;

 

New code (works for all file types):

$rgb = imagecolorat($source,$x,$y);			
$col = imagecolorsforindex($source, $rgb);
$r = $col['red'];
$g = $col['green'];
$b = $col['blue'];

 

The second set of values are accurate rgb values but the first set was completely wrong if the image was PNG or GIF.

e.g.

 

first      gives  96 183 40  for a JPG      0    0  20  for a GIF          0    0  49  for a PNG

second  gives  96 183 40  for a JPG    100 183  46  for a GIF        100 183  46  for a PNG

 

Any explanation welcome.

 

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.