PHP 7.0.6 Released

Image Processing and GD

User Contributed Notes

herbert dot walde at googlemail dot com
4 years ago
In case your script is using output-buffering-functions somewhere, then you have to clear the buffer first ( with ob_clear() ), before outputting an image with a function like imagepng().

And you should make sure that no buffer will get send after outputing an image by using the ob_end_flush()-function.

Furthermore you should check if a buffer has already been flushed somewhere before. This can be done using the headers_sent()-function.

Here is the full solution:

<?php
if(headers_sent()){
    die(
'Headers have been send somewhere within my script');
}

ob_clean(); //Clears the buffer

header('Content-type: image/png');
imagepng($img, NULL, 0NULL);

ob_end_flush(); //Now we send the header and image plus we make sure that nothing will get send from now on (including possible shutdown-functions and __destruct()-methods) till the end of page-execution
?>
kurdtpage at gmail dot com
5 years ago
When using GD, please make sure of the following things:

1. The file that is used to manipulate images is saved as ANSI format and not UTF-8
2. There is no space in front of the opening tag <?php
mail at ecross dot nl
6 years ago
hello there,
i made a function to create a gradient image.

description:
gradient(int image_width, int image_height,
int start_red, int start_green, int start_blue,
int end_red, int end_green, int end_blue,
bool vertical)

function:
<?php
function gradient($image_width, $image_height,$c1_r, $c1_g, $c1_b, $c2_r, $c2_g, $c2_b, $vertical=false)
{
// first: lets type cast;
$image_width = (integer)$image_width;
$image_height = (integer)$image_height;
$c1_r = (integer)$c1_r;
$c1_g = (integer)$c1_g;
$c1_b = (integer)$c1_b;
$c2_r = (integer)$c2_r;
$c2_g = (integer)$c2_g;
$c2_b = (integer)$c2_b;
$vertical = (bool)$vertical;

// create a image
$image  = imagecreatetruecolor($image_width, $image_height);

// make the gradient
for($i=0; $i<$image_height; $i++)
{
$color_r = floor($i * ($c2_r-$c1_r) / $image_height)+$c1_r;
$color_g = floor($i * ($c2_g-$c1_g) / $image_height)+$c1_g;
$color_b = floor($i * ($c2_b-$c1_b) / $image_height)+$c1_b;

$color = ImageColorAllocate($image, $color_r, $color_g, $color_b);
imageline($image, 0, $i, $image_width, $i, $color);
}

# Prints out all the figures and picture and frees memory
header('Content-type: image/png');

if(
$vertical){$image = imagerotate($image, 90, 0);}
ImagePNG($image);
imagedestroy($image);
}
?>
code at ashleyhunt dot co dot uk
7 years ago
I have been looking to send the output from GD to a text string without proxying via a file or to a browser.

I have come up with a solution.

This code buffers the output between the ob_start() and ob_end() functions into ob_get_contents()

See the example below

<?php
// Create a test source image for this example
$im = imagecreatetruecolor(300, 50);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5'A Simple Text String', $text_color);

// start buffering
ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($im, NULL, 85);
// capture output to string
$contents = ob_get_contents();
// end capture
ob_end_clean();

// be tidy; free up memory
imagedestroy($im);

// lastly (for the example) we are writing the string to a file
$fh = fopen("./temp/img.jpg", "a+" );
   
fwrite( $fh, $contents );
fclose( $fh );
?>

Enjoy!
Ashley
donatj at gmail dot com
4 years ago
UTF-8 is fine with GD - as well as any other Unicode transformation format - you just need to ensure your saved file doesn't contain the dreaded byte order mark.
Anonymous
2 years ago
<form action="index.php" method="POST" enctype="multipart/form-data">
    Titel:
    <input type="text" name="titel" />
    File:
    <input type="file" name="image"> <input type="submit" name="submit" value="Verzend">
</form>

<?PHP
//connection
include('connection.php');
if(isset(
$_POST['submit']))
{
    if((
$_POST['titel'])!="")
    {
       

$image = $_FILES['image']['tmp_name'];
$titel = $_REQUEST['titel'];

if (!isset(
$image))
    echo
"Please upload an image" ;
    else
    {
       
$image_size = getimagesize($_FILES['image']['tmp_name']);
       
        if(
$image_size==FALSE)
            echo
"This is not an image, Nice Try!";
            else
            {
       
       
$image = addslashes (file_get_contents ($_FILES['image']['tmp_name']));   
       
$image_name = addslashes ($_FILES ['image']['name']);
       
$thumb = imagecreatetruecolor(100,100);
       
$afb = $_FILES['image'];
       
$temp = $afb['tmp_name'];
       
$info = getimagesize($temp);
       
$br = $info['0'];
       
$hg = $info['1'];
       
$ext = $info['2'];
       
$source = imagecreatefromjpeg($temp);
       
imagecopyresampled($thumb, $source, 0, 0, 0, 0, 100, 100, $br, $hg);
       
$thumbname = "database/thumb/tn".$image_name;
       
$thumbnailname = "tn".$image_name;
       
imagejpeg ($thumb, $thumbname);
       
move_uploaded_file ($_FILES['image']['tmp_name'], "database/".$image_name);
       
move_uploaded_file ($_FILES['image']['tmp_name'], "database/thumb/".$thumbname);
       
       
                if (!
$insert = mysql_query("INSERT INTO images VALUES('','$titel','$image_name','$thumbnailname')"))
               
                echo
"Upload is not working.";
                else
                {
                   
               
$dir = 'database/';
               
$base_url = 'http://www.yourdomainname.com/foto/database';
               
$newest_mtime = 0;
               
$show_file = 'BROKEN';
                if (
$handle = opendir($dir)) {
                 while (
false !== ($file = readdir($handle))) {
                    if ((
$file != '.') && ($file != '..')) {
                      
$mtime = filemtime("$dir/$file");
                       if (
$mtime > $newest_mtime) {
                         
$newest_mtime = $mtime;
                         
$show_file = "$base_url/$file";
                                   }
                            }
                          }
                    }
                print
'<img src="' .$show_file. '" alt="$titel">';
               
//thumbnail
               
$dirthumb = 'database/thumb/';
               
$base_urlthumb = 'http://www.yourdomainname.com/foto/database/thumb';
               
$newest_mtime = 0;
               
$show_file = 'BROKEN';
                if (
$handle = opendir($dirthumb)) {
                 while (
false !== ($file = readdir($handle))) {
                    if ((
$file != '.') && ($file != '..')) {
                      
$mtime = filemtime("$dirthumb/$file");
                       if (
$mtime > $newest_mtime) {
                         
$newest_mtime = $mtime;
                         
$show_file = "$base_urlthumb/$file";
                                   }
                            }
                          }
                    }
                print
'<img src="' .$show_file. '" alt="$titel">';
                }
            }
    }
       
    }else { echo
"Oops! Looks like you forgot to upload the image<br>"; }
}
   
   

?>
Thomas
7 years ago
You know, maybe this goes without saying, but I thought I would drop a note in here.  When developing code to resize images, it is best not to use GD.  When using the current GD methodologies, you are reading content from an image and manipulating it.  By then writing that content to a brand new file, you are losing the EXIF data.

For purposes when you want to retain EXIF data, it is recommended that you compile in and use the PECL Imagick extension.  It has great resizing methods built right in and the EXIF data is retained.
zsolt dot trenyik at gmail dot com
2 years ago
According to  kurdtpage at gmail dot com, we faced a fairly strange behavior of GD. We saved an incluce file incorrectly, and everything worked (OCI8, other php functions) except GD. It took one and half day to find the reason, at the end commenting out the require part of the main file.

The solution was: we took a HEX editor to see if there is a problem with that .inc file. There was some crazy invisible characters before the <?php tag, signing that the text editor saved the file in utf format. These characters cannot be deleted, we had to open a new file in eclipse (notepad++ also works right), copy the visible part of the file to it, replace them, ready.

Maybe this detailed warning helps somebody.
mac_doggie at hotmail dot com
5 years ago
A way to read the color of a pixel:

<?php
   $img
= imagecreatefrompng("image1.png");
  
  
$w = imagesx($img);
  
$h = imagesy($img);
  
   for(
$y=0;$y<$h;$y++) {
      for(
$x=0;$x<$w;$x++) {
        
$rgb = imagecolorat($img, $x, $y);
        
$r = ($rgb >> 16) & 0xFF;
        
$g = ($rgb >> 8) & 0xFF;
        
$b = $rgb & 0xFF;        
         echo
"#".str_repeat("0",2-strlen(dechex($r))).dechex($r).
str_repeat("0",2-strlen(dechex($g))).dechex($g).
str_repeat("0",2-strlen(dechex($b))).dechex($b).",";
      }
      echo
"<br />\r\n";
   }
?>

[EDIT BY thiago: merged two notes from same submitter.]
To Top