图像生成和处理
在线手册:中文  英文

Image Processing and GD


图像生成和处理
在线手册:中文  英文

用户评论:

herbert dot walde at googlemail dot com (2012-01-04 11:41:15)

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($imgNULL0,  NULL);

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
?>

donatj at gmail dot com (2011-07-12 13:43:03)

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.

kurdtpage at gmail dot com (2011-04-27 22:53:15)

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

mac_doggie at hotmail dot com (2010-05-28 07:50:32)

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.]

rmayo100 at yahoo dot com (2010-05-18 08:05:27)

I use GD to create graphs of data that exists in my system. I use a link like this to place the graph image on my page:
<img src="image.php" name="Image">
And this works just fine. Image.php acquires the data to be graphed and creates a png image with it. (And is even able to do it very quickly.)
However, I would also like to have external access that data. Unfortunately, it's is acquired by the graphing function from a UDP broadcast stream and I have no idea how to make it available outside that file (or how to capture it twice, perhaps).
I've had exactly no luck trying to implement a global variable, I suspect, because global variables really aren't global and their scope doesn't span multiple files.
I don't know if this is the right venue for this post, but I'm stumped so far and I had to post it somewhere.
Thanks,
R.

mail at ecross dot nl (2010-04-03 07:31:02)

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($image0$i$image_width$i$color);


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

if(
$vertical){$image imagerotate($image900);}
ImagePNG($image); 
imagedestroy($image); 
}
?>

jordan at jkdesign dot org (2009-09-07 15:09:13)

Building on Ashley's example, here's an example of some code that grabs an existing image file and outputs an html img tag with the contents. I found it useful because I needed to not broadcast the filenames.

<?php
$file 
'images/01.png';
$image imagecreatefrompng($file);
imagealphablending($imagefalse);
imagesavealpha($imagetrue);

// start buffering
ob_start();
imagepng($image);
$contents =  ob_get_contents();
ob_end_clean();

echo 
"<img src='data:image/png;base64,".base64_encode($contents)."' />";

imagedestroy($image);
?>

scurvysquid at yahoo dot com (2009-05-04 12:08:20)

to address Thomas' note about exif data, exif is only valid for .tiff and .jpg files. As always, it's up to the individual to make the call but I personally would prefer to create an abstraction layer to work for all images, and relying on exif data means you need to limit your allowed image types. I've heard some great things about the GD library and found them to all be true in my own use of it, losing the nominally useful data specific to jpegs and pngs is not a sufficient reason alone to convince me to use imagemagick instead.

Thomas (2008-12-10 14:05:35)

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.

code at ashleyhunt dot co dot uk (2008-10-23 18:02:57)

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(30050);
$text_color imagecolorallocate($im2331491);
imagestring($im155,  'A Simple Text String'$text_color);

// start buffering
ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($imNULL85);
// 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

易百教程