|
|
 |
imagepng (PHP 3 >= 3.0.13, PHP 4, PHP 5) imagepng -- Output a PNG image to either the browser or a file Descriptionbool imagepng ( resource image [, string filename] )
The imagepng() outputs a GD image stream
(image) in PNG format to standard output
(usually the browser) or, if a filename is given by the
filename it outputs the image to the file.
See also imagegif(), imagewbmp(),
imagejpeg(), imagetypes().
User Contributed Notes
imagepng
php at no dot spam dot prosa dot net
04-May-2005 09:40
You could use the function imagecreatefrompng
(I assume that you already know how to get the text from the url.)
The only thing left to do is put that text on the image using the correct colors for you.
<?php
$im = @imagecreatefrompng($imgname);
$text_color = imagecolorallocate ($im, $Red,$Green,$Blue);
imagestring ($im, 3, 5, 15, $SomeTextFromURL, $text_color);
?>
Regards,
Peter Berkhout.
14-Apr-2005 02:11
To cbrasho at yahoo dot com
I have read your note and the note that was made in reply. My SIMPLE solution is to add a key to each image record in the database so that the ID+Key pair will be used very similarly to a Username+Password pair =) all you have to do is create a unique random number or something to put in the "Key" field of the database when the entry is made.
i've modified the code and pasted it here...
<?php
$id = $_REQUEST['id'];
$key = $_REQUEST['key']; $sql = "SELECT Data, Type, Extension FROM Images WHERE ID=$id AND Key=$key"; $records=mysql_query($sql);
$record=mysql_fetch_row($records);
$data=$record['Data'];
$type=$record['Type'];
$ext=$record['Extension'];
header("Content-Type: $type");
header("Content-Disposition: inline; filename=img$id.$ext");
echo $data;
?>
all i did was add 1 line and change another =D
now if "image.php?id=1&key=A29F1X" gives a result, "image.php?id=2&key=A29F1X" will output an image of zero bytes in size because the keys in the database are unique =)
dws at mrao dot cam dot ac dot uk
22-Jan-2005 04:03
Presumably it returns true on success and false on failure, although the documentation doesn't actually say so.
10-Nov-2004 04:08
To cbrasho at yahoo dot com
I don't get the problem. If you want to have images stored as blobs, you can do a show.php like this:
<?php
$id = $_REQUEST['id'];
$sql = "SELECT Data, Type, Extension FROM Images WHERE ID=$id";
$records=mysql_query($sql);
$record=mysql_fetch_row($records);
$data=$record['Data'];
$type=$record['Type'];
$ext=$record['Extension'];
header("Content-Type: $type");
header("Content-Disposition: inline; filename=img$id.$ext");
echo $data;
?>
I've done this many times (conceptually), and it works like a charm, although I would recommend a little more security on that indata. If you have a unified place images go in (like an upload form), you can even drop the type and extension part by saving every image as the same filetype.
pm at dontspamme dot pietmarcus dot com
23-Aug-2004 03:43
in reply to: cbrasho at yahoo dot com
if you use Apache as a webserver, you could do the following:
You could set up a 'img' directory in your webspace.
In that directory there will be two files: a .htaccess file and a img.php file
the .htaccess file contains the following code:
ErrorDocument 404 /img/img.php
the img.php file looks something like this:
<?php
$file = $_SERVER['REDIRECT_URL'];
$result = mysql_query('select img_blob from images where filename=\\'' . $file . '');
list($blob) = mysql_fetch_row($result);
header('HTTP/1.0 200 Ok');
header("Content-type: image/jpeg");
print $blob; # or whatever works, I don't use this
?>
if you use a url for your image like http://test.com/img/image1.jpeg, which doesn't exist, normally you would get a 404-page. in this case, the 404 is being handled by img.php, which brings up the required image...
cbrasho at yahoo dot com
17-Aug-2004 09:49
Having your pictures stored in a database sounds great but brings you a lot of trouble.
Storing images in a DB you will have a script show.php that will appear in <img> tags: <img src='show.php?img_id=$some_id'>
But if you want to have REGISTER GLOBALS = OFF, you are in trouble and there is no way (at leas as far as i know) to solve the problem but to put te img from the DB in a file and put the coresponding file name in the <img> tag. But this brings another problem: simultaneous accesses to the page. So you will have to find a way to give unique names to the picture files for each simultaneous access to the page. The solution might be using sessions. This is how you end up having a very compleh PHP script for a very simple problem. So, the basic ideea is " do not store your pictures in a blob unless you know exactly what you are doing".
mail at stefanbechtold dot de
16-Apr-2003 08:14
to all the ones, who like having their users fill their profil with an image without destroying a fixed design the following should be a great way to handle this problem.
this file opens a picture from $imagepath and returns it as a valid picture to embed in: <img src="file.php?image=123.jpg[?maxX=200&maxY=150]"> (in [] = optional)
but this file does more than this. it also adds black borders to files that are smaller than the max. size, so adding borders to the left and right where a image is too high :-)
if there is a need for a copyright note this script will also help you. you can put in a various text to $copyright. the text length should be in relationship to $maxX and $maxY.
Well there are other features of the script, just try'em out and have fun with it :-)
bye
<?php
if(!isset($maxX)) $maxX = 100;
if(!isset($maxY)) $maxY = 75;
$picBG = "0,0,0"; $picFG = "104,104,104"; $copyright = "stefan bechtold";
$font = 1;
$minZoom = 1; $maxZoom = 200; $imgpath = "userimages/"; $nopicurl = "../images/nopic.jpg"; $nofileurl = "../images/nofile.jpg"; if(!isset($image) || empty($image))
$imageurl = $imgpath . $nopicurl;
elseif(! file_exists($imgpath . trim($image)))
$imageurl = $imgpath . $nofileurl;
else
$imageurl = $imgpath . trim($image);
$image = getImageSize($imageurl, $info); switch($image[2]) {
case 1:
$timg = imageCreateFromGIF($imageurl);
break;
case 2:
$timg = imageCreateFromJPEG($imageurl);
break;
case 3:
$timg = imageCreateFromPNG($imageurl);
break;
}
$imgX = $image[0];
$imgY = $image[1];
$_X = $imgX/$maxX * 100;
$_Y = $imgY/$maxY * 100;
if((100-$_X) < (100-$_Y)) $_K = $_X;
else $_K = $_Y;
if($_K > 10000/$minZoom) $_K = 10000/$minZoom;
if($_K < 10000/$maxZoom) $_K = 10000/$maxZoom;
$newX = $imgX/$_K * 100;
$newY = $imgY/$_K * 100;
$posX = ($maxX-$newX) / 2;
$posY = ($maxY-$newY) / 2;
$imgh = imageCreateTrueColor($maxX, $maxY);
$cols = explode(",", $picBG);
$bgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));
$cols = explode(",", $picFG);
$fgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));
imageFill($imgh, 0, 0, $bgcol);
imageCopyResampled($imgh, $timg, $posX, $posY, 0, 0, $newX, $newY, $image[0], $image[1]);
imageStringUp($imgh, $font, $maxX-9, $maxY-3, $copyright, $fgcol);
switch($image[2]) {
case 1:
header("Content-type: image/gif");
imageGIF($imgh);
case 2:
header("Content-type: image/jpeg");
imageJPEG($imgh);
case 3:
header("Content-type: image/png");
imagePNG($imgh);
}
imageDestroy($timg);
imageDestroy($imgh);
?>
23-Jan-2003 12:20
"Tip: As with anything that outputs its result directly to the browser, you can use the output-control functions (http://www.php.net/manual/en/ref.outcontrol.php) to capture the output of this function, and save it in a string (for example)."
ob_start();
imagepng($image);
$image_data = ob_get_contents();
ob_end_clean();
And now you can save $image_data to a database, for example, instead of first writing it to file and then reading the data from it. Just don't forget to use mysql_escape_string...
johnbeech at mkv25.net
20-Jan-2003 06:41
PNG files are already compressed. They use a lossless compression algorithm. If you are using HighColour images, the compression only does so much. For low colour images (16 or 256) the compression is much better.
It is pointless trying to compress the images further before sending to a browser.
bgd1977 at hotmail dot com
26-Jul-2002 08:37
I have experienced segfaults and bus errors with the following configuration: FreeBSD4.4, Apache 1.3.26, PHP 4.2.2, GD-1.8.4, PDFlib 4.0.1. The apache process crashed when calling the imagepng function, but it didn't crash when calling the imagejpg function, or imagecreatefrompng...
Some wasted hours (lots) later, in which I have tried to recompile gd, libpng, php, libjpeg, what-not, I have found the following advices:
http://bugs.php.net/bug.php?id=16841
So the problem was not with the png library, but rather with the PDFlib. Even though all the threads led to a png-problem... so I have simply upgraded to PDFlib 4.0.3 (w/o any special configure arguments; --with-libpng didn't work anyways), recompiled PHP, and now everything works (imagepng, pdf creation, etc.).
Hope this helps,
bogdan
ruelle at xtof dot com
17-Feb-2002 08:34
Better than a chmod 777 to any '/dir/pic.png' you should :
- test if dir is writable (is_writable func.)
- use chmod 700 (more secure because let only the webserver ID have access)
In any case you should program a (crontab) script to change the owner ID of any images created.
| |