Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Image Functions : imagecreatefromjpeg

imagecreatefromjpeg

Create a new image from file or URL (PHP 4, PHP 5)
resource imagecreatefromjpeg ( string filename )

Example 1001. Example to handle an error during creation

<?php
function LoadJpeg($imgname)
{
   
$im = @imagecreatefromjpeg($imgname); /* Attempt to open */
   
if (!$im) { /* See if it failed */
       
$im  = imagecreatetruecolor(150, 30); /* Create a black image */
       
$bgc = imagecolorallocate($im, 255, 255, 255);
       
$tc  = imagecolorallocate($im, 0, 0, 0);
       
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
       
/* Output an errmsg */
       
imagestring($im, 1, 5, 5, "Error loading $imgname", $tc);
   }
   return
$im;
}
header("Content-Type: image/jpeg");
$img = LoadJpeg("bogus.image");
imagejpeg($img);
?>

The above example will output something similar to:


Related Examples ( Source code ) » imagecreatefromjpeg



Code Examples / Notes » imagecreatefromjpeg

mihkel

[Ed Note: You must have netpbm installed for this to work --alindeman @ php.net]
Just wanted to let you know that
imagecreatefromjpeg crashes php
(command line at least) sometimes with segmentation fault when jpeg is corrupted.
To get rid of the nasty segmentation fault i used
system ("jpegtopnm f.jpg > f.pnm", $r);
if ($r != 0) {printf ("invalid jpeg\n"); return; }
system ("pnmtopng f.pnm > f.png");
$im =imagecreatefrompng ("f.png");


jason_wilk

Wow, it only took me 3 hours to get all of the lib paths correct for my install. Some of them are /usr, and some are /usr/lib...go figure. I figured that I would post this in the hopes that it will save somebody some time.
Remember that if you're using rpm installs...you have to install the devel packages. For example, if you're installing mysql from rpm, and you want to compile with support for your particular MySql dist, you must install mysql-devel*.rpm.
Anyway, I'm a redhat 7.1 install...with all appropriate devel packages installed.
./configure \
--with-mysql=/usr \
--with-ftp \
--with-apxs=/home/www/bin/apxs \
--with-xpm-dir=/usr/X11R6 \
--with-gdbm=/usr/lib \
--with-gd=/usr \
--with-zlib-dir=/usr/lib \
--with-jpeg-dir=/usr/lib \
--with-png-dir=/usr/lib \
--with-tiff-dir=/usr/lib \
--with-config-file-path=/home/www/conf \
--with-freetype-dir=/usr/lib \
--enable-magic-quotes \
--enable-track-vars


support

Wonder why that's just the only image function you can't get to work? Remember that you have to use a gd library that supports JPEG (make it manually and <important>edit the makefile</important>)! Especially all gd RPMs from SuSE (including 7.0) don't support it as it's not default up to gd 1.8.3.

anatol

When working with uploaded jpeg files it is usually a good idea to execute a little but very useful program called jhead
( http://www.sentex.net/~mwandel/jhead/ ).
This will clean up unnecessary jpeg header information which can cause trouble. Some cameras or applications write binary data into the headers which may result in ugly results such as strange colors when you resample the image later on.
Usage:
<?php
exec("/path/to/jhead -purejpg /path/to/image");
// for example when you uploaded a file through a form, do this before you proceed:
exec("/path/to/jhead -purejpg ".$file['tmp_name']);
?>
I didn't have the chance to test this but I guess this might even solve the problem caused by images that were taken with Canon PowerShot cameras which crash PHP.
This is from the jhead documentation: "-purejpg: Delete all JPEG sections that aren't necessary for rendering the image. Strips any metadata that various applications may have left in the image."
jhead got some other useful options as well...


henk_vd_bosch

When i run following function dis function terminates at the  
13th line where is says:
$img = @imagecreatefromjpeg($image_path);
no other code of the script gets executed. can anyone help me. i use PHP5 with GD lib support
function convertLQ($image_path)
{
 ClearStatCache();
 $file = basename($image_path);
 $dirname = dirname ($image_path);
 // set save path + name
 $save_path = $dirname.'/LQ/'.$file;
 // Load image
 $img = null;
 $ext = strtolower(end(explode('.', $image_path)));
 $image_path = htmlentities($image_path);
 if ($ext == 'jpg' || $ext == 'jpeg')
 {
   $img = @imagecreatefromjpeg($image_path);
 }
 else if ($ext == 'png')
 {
   $img = @imagecreatefrompng($image_path);
 }
 else if ($ext == 'gif')
 {
   $img = @imagecreatefromgif($image_path);
 }
 // If an image was successfully loaded, test the image for size
 if ($img)
 {
   // Get image size and scale ratio
   $width = imagesx($img);
   $height = imagesy($img);
   $scale = maxHeightLQ/$height;
   // If the image is larger than the max shrink it
   if ($scale < 1)
   {
     $new_width = floor($scale*$width);
     $new_height = floor($scale*$height);
     // Create a new temporary image
     $tmp_img = imagecreatetruecolor($new_width, $new_height);
     // Copy and resize old image into new image
     imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
     imagedestroy($img);
     $img = $tmp_img;
   }
 }
 // Create error image if necessary
 if (!$img)
 {
   $img = imagecreate(witdhErrorImage,heightErrorImage);
   $backgroundcolor = imagecolorallocate($img,70,70,70);
   $c = imagecolorallocate($img,70,70,70);
   $red = ImageColorAllocate($img,255,0,0);
   imageline($img,0,0,witdhErrorImage,heightErrorImage,$red);
   imageline($img,witdhErrorImage,0,0,heightErrorImage,$red);
   imagejpeg($img,$save_path,85);
   imagedestroy($img);
   return false;
 }
 // Save the image
 if ($ext == 'jpg' || $ext == 'jpeg')
 {
   imagejpeg($img,$save_path,85);
 }
 else if ($ext == 'png')
 {
   imagePng($img,$save_path);
 }
  else if ($ext == 'gif')
 {
   ImageGif($img,$save_path);
 }
 else
 {
   imagejpeg($img,$save_path,85);
 }
 imagedestroy($img);
 return true;
}


javier rayon

Using imagecreate() combined with imagecreatefromjpeg() in PHP 4.3.0 and up creates wrong color jpeg's.
Use imagecreatetruecolor() instead of imagecreate() for right color images.


zap

Under some configurations imagecreatefromjpeg will create files that are owned by the webserver rather than the php user. For example, php may be run as phpuser and the image will be created under apache.
This can lead to permissions problems - only a +0777 will be enough to be able to create a picture.
My solution was to chmod over ftp to 0777 just before the picture is written then change back to 0755 when the image has been created.
The alternative of course would be to have a properly configured system...


rodders_plonker

To all those having trouble with a message to the effect of:
CreateImageFromJpeg() not supported in this PHP build
Start by adding --with-jpeg-dir to your ./configure options as I left this out (not knowing I needed it) and I spent the best part of 6 hours trying to compile to get this option. (RH 6.2, PHP 4.0.1pl2, Apache 1.3.12, GD 1.8.3)


huguowen

Tips for Windows User to Set up GD(dynamic graphic lib) with PHP.
Problem I meet:
When i run following function, which terminates at  
$img = @imagecreatefromjpeg($image_path);
error message is : undefined function imagecreatefromjpeg();
no other code of the script gets executed.
Solution:
In one word, you need to turn on gd lib,
which hold the implementation of imagecreatefromjpeg();
please follow below steps:
my php install dir is: c:/php/
first you must try to find:
c:/php/php.ini  
c:/php/ext/php_gd2.dll(php 5)
c:/php/extension/php_gd2.dll(php 4)
The php_gd2.dll is included in a standard PHP installation for Windows,
however, it's not enabled by default.
You have to turn it on,
You may simply uncomment the line "extension=php_gd2.dll" in php.ini and restart the PHP extension.
Change:
,extension=php_gd2.dll
To:
extension=php_gd2.dll
You may also have to correct the extension directory setting
from:
extension_dir = "./"
extension_dir = "./extensions"
To (FOR WINDOWS):
extension_dir = "c:/php/extensions"(php 4)
extension_dir = "c:/php/ext"(php 5)
Cheers!


angel leon

This is a very useful script when you have hundreds of images and you need a quick setup for a thumbnail, where you can select how many
pictures per row, size of the thumbnail, and the size of the pictures when clicked, all in one script. Just throw all your images and this script in a file named index.php or index.html (if your apache httpd.conf defaults to html and runs .html as php).
Script also contains simple text watermarking. See function thumbImage()
and modify to add image watermarking if you like.
<?
// 30 Minutes Thumbnail script written by Angel Leon from wedoit4you.com
// Licensed under the GPL
// Courtesy of wedoit4you.com
//Instructions:
//copy this script wherever you have a bunch of .jpgs
// Invoke your thumbnail like this http://mysite.com/imageFolder/index.php
//where index.php is this script.
//Modify and redistribute but don't remove our trademark.

//configure script here
//pictures per row
$row_size = 3;
//height of the pictures in thumbnail
$thumb_height = 200;
//height of the pictures when clicked (to save bandwidth)
$big_image_height=668;
//short name of your site
$waterMark = "mysite.com";
$dh = opendir(".");
$files = array();
while (($file = readdir($dh)) !== false) {
 if (ereg("jpg",$file) || ereg("gif",$file) || ereg("png",$file)) {
 $files[] = $file;
 }
}
closedir($dh);
if ($show_image) {
 thumbImage($show_image,$big_image_height,$waterMark);
} else if ($thumb_image) {
 thumbImage($thumb_image,$thumb_height,$waterMark);
}
else {
 echo "<center>" . createThumbTable($files,$row_size) . "</center>";
}
function createThumbTable($files,$pics_wide) {
 $row = intval(count($files)/$pics_wide);
 $picIndex = 0;
 $rs = "Mostrando " . count($files) . " imagenes
";
 $rs .= "<table border=0 cellspacing=1 cellpadding=0 style='border:1px solid black'>\n";
 for ($i=0; $i <$row; $i++) {
   $rs .= "\t<tr>\n";
   for ($picIndex,$j=0;
$j < $pics_wide && $picIndex < count($files);
$j++,$picIndex++) {
     $rs .= "\t\t<td><a href=index.php?show_image=" .
$files[$picIndex] . ">" .
"<img src=index.php?thumb_image=" .
     $files[$picIndex] . " border=0 title='Copyright wedoit4you.com'></a></td>\n";
     //$rs .= "<td>i=$i / $j=$picIndex</td>";
   
   }
   $rs .= "\t</tr>\n";
 }//for
 $rs .= "<tr><td colspan=$pics_wide align=center>Free Thumbnail script by <a href=http://www.wedoit4you.com>wedoit4you.com</a>
Written by Angel Leon (March 2005)</td></tr></table>\n";
 return $rs;
} //createThumbTable
function thumbImage($file,$img_height,$waterMark) {
 $img_temp = imagecreatefromjpeg($file);
 $black = @imagecolorallocate ($img_temp, 0, 0, 0);
 $white = @imagecolorallocate ($img_temp, 255, 255, 255);

 $font = 2;
 $img_width=imagesx($img_temp)/imagesy($img_temp)*$img_height;
 $img_thumb=imagecreatetruecolor($img_width,$img_height);
 imagecopyresampled($img_thumb,
 $img_temp,0,0,0,0,$img_width,
 $img_height,
 imagesx ($img_temp),
 imagesy($img_temp));
 $originx = imagesx($img_thumb) - 100;
 $originy = imagesy($img_thumb) - 15;
 @imagestring ($img_thumb, $font, $originx + 10, $originy,
     $waterMark, $black);
 @imagestring ($img_thumb, $font, $originx + 11, $originy - 1,
     $waterMark, $white);
 header ("Content-type: image/jpeg");
 imagejpeg($img_thumb, "", 60);

 imagedestroy ($img_thumb);
}
?>


dmjoe

This function DOES accept paths in the filename, just make sure they're absolute paths.  A relative path won't work, at least it didn't for me. This is in response to jonlup's comment from june 25:
"I played with "imagecreatefromjpeg()" function and, after a few tests, I found that the filename that it requires as parameter should be only a simple filename: the function does not work if in the string of the filename is specified a path to that file."


webmaster

The prior script by "e dot a dot schultz at gmail dot com", have a bug
$memoryLimitMB don't have a value
Add
        $memoryLimitMB = 8;
Before
         $memoryLimit = 8 * $MB;
And change that line for:
         $memoryLimit = $memoryLimitMB * $MB;
--------------
Something similar happens with the script by "JohnBrook at pobox dot com"
$memoryLimit don't have a value
Change:
$memoryLimit = $memoryLimit * $MB;
For:
 $memoryLimit = $memoryLimitMB * $MB;


cs

The ImageCreateFromJPEG() function is capable of throwing an emalloc() error.  If this happens, the script will die, but the error will be in your error logs.  You should ensure that you have memory available before creating a large image from a jpeg file.

miczimbett

the check_jpeg function listed above has a small "bug" when u set $fix=true... after the fix, the function does not close the file... and the imagecreatefromjpeg would still crash on an open file.
   //# [070203]
   //# check for jpeg file header and footer - also try to fix it
   function check_jpeg($f, $fix=false ){
       if ( false !== (@$fd = fopen($f, 'r+b' )) ){
           if (fread($fd,2)==chr(255).chr(216) ){
               fseek ( $fd, -2, SEEK_END );
               if ( fread($fd,2)==chr(255).chr(217) ){
                   fclose($fd);
                   return true;
               }else{
                   if ($fix && fwrite($fd,chr(255).chr(217)) ){
                    fclose($fd);
                    return true;
                   }                    
                   fclose($fd);
                   return false;
               }
           } else {
               fclose($fd);
               return false;
           }
       } else {
           return false;
       }
   }


sne

small script that calculates square (in %) of eche color on the PNG image.
<?
$t1=time();
$im1=ImageCreatefrompng('1.png'); //name of the png file
echo "<img src=1.png>";
$widthIm=ImageSX($im1);
$heightIm=ImageSY($im1);
$total=$widthIm*$heightIm;
$cvcol=imagecolorstotal($im1);
for ($i=0; $i<$widthIm; $i++){
   for ($j=0; $j<$heightIm; $j++){
$tochka=imagecolorat($im1,$i,$j);
$num[$tochka]=$num[$tochka]+1;
}
}
echo "
$widthIm x $heightIm ($total pixels).";
echo " Number of colors in pallette - $cvcol
";
echo "<table width=400 border =1>";
for ($k=0; $k<$cvcol; $k++) {
$proc=round($num[$k]/$total*100, 2);
$Palitra =ImageColorsForIndex($im1,$k);
$Palitra[red]= dechex($Palitra[red]);
$Palitra[green]= dechex($Palitra[green]);
$Palitra[blue]= dechex($Palitra[blue]);
echo "<tr><td>$k</td><td width=100>$Palitra[red]-$Palitra[green]-$Palitra[blue]</td>";
echo "<td width=100>$proc %</td>";
echo "<td width=100 bgcolor=$Palitra[red],$Palitra";
echo "[green],$Palitra[blue]>&nbsp;</td></tr>";
}
echo "</table>";
imagedestroy($im1);
$t2=-$t1+time();
echo "
Time past: $t2 sec";
?>


kapishonas

script for nokia photos which end with FF D9 and still imagecreatefromjpeg() returns error.
<?php
error_reporting( 32 );
header( 'Content-Type: image/jpeg' );
$imgPath = 'att.jpg';
// Atdod atpakaļ GD_ImageResource
function imageCreateFromJpegEx($file)
{
   $data = file_get_contents($file);
   $im = @imagecreatefromstring($data);
   $i = 0;
   while (!$im)
   {
       $data = substr_replace($data, "", -3, -2);
       $im = @imagecreatefromstring($data);
   }
   return $im;
}
$im = imageCreateFromJpegEx($imgPath);
imagejpeg( $im );
?>
script by Delfins in latvian php forums


05-jun-2006 06:42

regarding e dot a dot schultz at gmail dot com post
i tried the script (with the bugfixes posted later) and still got memorytrouble. most often it is still not enough memory to upload big images, even if it seems to calculate right. so this helped my perfectly:
$newLimit = $newLimit+3000000; (before passing it to the ini_set() function).
extremly simple and maybe not the best solution, but it works for now (you sure can give it less than an additional 3mb, just try what works for you).


tuxedobob

Note for PHP 4.3 under Mac OS X 10.2.3:
I originally compiled using only --with-mysql --with-apxs. When this compiled correctly (for a change; previous versions didn't), I then tried adding --with-gd --with-jpg-dir and a bunch of other goodies, but they didn't add in. Apparently removing config.cache isn't sufficient. My advice is to simply delete the entire folder, and try your new configure command on a clean untarred source folder.


christoph ziegenberg

Matt reported that PHP crashs using imagecreatefromjpeg() - that's true and it took me a lot of time to find the error - but not only the Canon PowerShot S70, also the Canon PowerShot  A400 lets PHP (5.1.2) crash, without any chance to catch it!
So I exclude all Canon PowerShot images with the following check:
function check_canonpowershot($filename)
{
if (strpos(file_get_contents($filename), 'Canon PowerShot') !== false)
{
return true;
}
return false;
}


ben dot lancaster

It is worth noting that all of the imagecreate* functions quite intentionally do not look in the include_path

brett_no_spam

In the new versions (PHP 4.0.6, GD 2.0.1), ImageCreateFromJPEG() results in a TRUE COLOR image.
In the older versions, you only get 256 colors.


matt with imdllc.net

In running 4.3. Found out that jpegs generated by Canon PowerShot S70's cause imagecreatefromjpeg() to crash PHP [page cannot be displayed]. Made this function to check for it:
<?php
function check_s70($filename) {
$thereturn = false;
$handle = fopen($filename, "r");
$contents = fread($handle, 159);
fclose($handle);
if (substr($contents, 156, 3) == "S70") {
$thereturn = true;
}
return $thereturn;
}
?>


mboucher

In response to my own post:
Maybe this is common knowledge but here is how I solved my problem. Hopefully this will help out seeing how I couldn't find any other articles on this topic with a solution.
This seems to work pretty well. Displays in browser and QT Picture Viewer but for some reason Photoshop won't open it. Translation error. Since I'm just using it to cache the image for when the our content provider goes down no biggie there.
$si = fopen($imagePathURL, "r");   // open URL
   
   $serverImg = fread($si, 1000000);   // read contents
       
fclose($si);   // close file
   
/* open file to save to (w+ creates if file does not exist || b opens binary safe [Win32]) Seemed to work fine with out the 'b' on Windows NT but just to be safe. */
$si = fopen($saveImgTo, "w+b");
   
   fwrite($si, $serverImg);   // write contents to file
   
fclose($si);   // close file
Hope this helps somebody...long live PHP


e dot a dot schultz

In John's human readable code version of Karolis code to dynimicly allocate need memory there are a few bugs. If you didn't compile with the "--enable-memory-limit" option, this script will error with a level E_ERROR. Bellow is a fixed version rapped as a function. To view replacement functions for memory_get_usage() look at http://us2.php.net/manual/en/function.memory-get-usage.php
<?php
function setMemoryForImage( $filename ){
$imageInfo = getimagesize($filename);
$MB = 1048576;  // number of bytes in 1M
$K64 = 65536;    // number of bytes in 64K
$TWEAKFACTOR = 1.5;  // Or whatever works for you
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
  * $imageInfo['bits']
  * $imageInfo['channels'] / 8
+ $K64
  ) * $TWEAKFACTOR
);
//ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also
//Default memory limit is 8MB so well stick with that.
//To find out what yours is, view your php.ini file.
$memoryLimit = 8 * $MB;
if (function_exists('memory_get_usage') &&
memory_get_usage() + $memoryNeeded > $memoryLimit)
{
$newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
+ $memoryNeeded
- $memoryLimit
) / $MB
);
ini_set( 'memory_limit', $newLimit . 'M' );
return true;
}else
return false;
}
}
?>


karolis tamutis karolis.t_at_gmail.com

In addition to yaroukh at gmail dot com comment.
It seems that even a small image can eat up your default memory limit real quick. Config value 'memory_limit' is marked PHP_INI_ALL, so you can change it dynamically using ini_set. Therefore, we can "allocate memory dynamically", to prevent those memory limit exceeded errors.
<?php
$imageInfo = getimagesize('PATH/TO/YOUR/IMAGE');
$memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2)) {

   ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');

}
?>


info

In a post by Angel Leon, an example script was given that forms a thumbnail gallery using imagecreatefromjpeg.  I am fairly new to php scripts, but I found that the script did not display the table of thumbnail images if the row wasn't "filled" with images.. i.e. if there were 5 images in the folder and the script specified 3 rows in the table, then the page would only display the thumbnails for the first row and only three images were shown.  I found that if you specified the variable row with this equation, then the table would display properly:
$row = intval(count($files)+($row_size-1));
(This is the first line in the createThumbTable function.)


jdolecek

ImageCreateFromJPEG() as of GD 2.0.15 (as bundled with PHP 4.3.4) doesn't handle 4-channel (with alpha channel) JPG images well, the function fails and emits message 'Unsupported color conversion request' to stderr. The solution I found for this is to use NetPBM tools - 'jpegtopnm < orig.jpg | pnmtojpeg > new.jpg' creates a JPG image PHP GD library can open just fine.

1

imagecreatefromjpeg doesn't seem to support cmyk-jpgs :-(

rich

If you get this error: "Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error" then check the JPEG files. If they are saved in CMYK format (instead of RGB) then GD will fail to load them (tested with GD 2.0.12)

hvozda

If imagecreatefromjpeg() fails with "PHP Fatal error:  Call to undefined function:  imagecreatefromjpeg()", it does NOT necessarily mean that you don't have GD installed.
If phpinfo() shows GD, but not JPEG support, then that's the problem.  You would think that --with-gd would do the right thing since it does check for the existance of libjpeg (and finds it) and add that feature to GD, but it doesn't in v4.4.4 at least on RHEL v2.1, RHEL v3, CentOS v2.1 or CentOS v4.3.
On those platforms, it's *important* that --with-jpeg-dir be *before* --with-gd.  If it's not, GD won't build with jpeg support as if --with-jpeg-dir had never been specified...


sales

I've found a bug in CentOS 4.x that, while previously addressed, does not seem to be directly addressed here as far as the nature of the bug is concerned.
If you are having a problem getting this function to work on CentOS 4.4 (may appear earlier) and are receiving this error:
Call to undefined function imagecreatefromjpeg()
This is because the installation *does* support JPG by default if you have libjpeg installed. However, the config script finds libjpeg in /usr/lib but it is never successfully added to the PHP build.
To fix this, you should recompile PHP and be absolutely sure to add '--with-jpeg-dir' to the config command. This should appear BEFORE the --with-gd option. Example:
'--with-jpeg-dir' '--with-gd'
If you don't put it before --with-gd, the option is completely ignored.
As always, be sure to do a 'make clean' before a 'make install'. I made the mistake of forgetting to check and wasted 30 minutes trying to resolve this problem simply because I forgot to clean up after myself previously.


jonlup

I played with "imagecreatefromjpeg()" function and, after a few tests, I found that the filename that it requires as parameter should be only a simple filename: the function does not work if in the string of the filename is specified a path to that file.
The quickest workaround found: do a chdir() to the directory of your image file before try to use "imagecreatefromjpeg()" with your file as parameter.
I did not test the other functions (imagecreatefromgd2(), imagecreatefromgd(), imagecreatefromgif() etc.), but I suppose that they work in the same way.
I think that little trick should be specified in the manual.


tl

I made a script to produce, save, and use dynamic buttons simultaneously. If the file exists, it will be shown as usual. If not, this script produces a new image and saves it. You only need the background (back.jpg). Maybe it is useful for somone.
<?php
class Button {
   var $ib = 'back.jpg';
   var $im;
   function Button ($fileName, $string) {
       $this -> im = $fileName;
       if(!file_exists($this -> im)) {
           $this -> _createButton($string);
       }
   }
   
   function getFileName() {
       return $this -> im;
   }
   
   function _createButton($string) {
       $font  = 4;
       $width  = max(400,(ImageFontWidth($font) * strlen($string)) + 4);
       $height = max(20,(ImageFontHeight($font) + 4));
       
       $imgBack=ImageCreateFromJPEG($this -> ib);
       $imgText=ImageCreateTrueColor($width,$height);
       
       $textColor = imagecolorallocate ($imgText,90,90,90);
       
       ImageCopy($imgText,$imgBack,0,0,0,0,$width,$height);
       ImageString ($imgText,$font,2,2,$string,$textColor);
       ImageJPEG($imgText,$this -> im,85);
       ImageDestroy($imgBack);
       ImageDestroy($imgText);
       chmod ($this -> im,0644);
   }
}
$button = new Button('button.jpg','button text');
echo '<img src="' . $button -> getFileName() . '">';
?>


dmsales

I just wanted to note here something i found else where that was very helpful to me when using jpeg images.  when using imagecreatefromjpeg()  it can be difficult to allocate new colors.  
The work around i found was posted under imagecolorallocate() and prescribes that you first use imagecreate(), allocate colors, and then copy the jpeg into this image.


ceefour -at!- gauldong.net

I have to say recompiling PHP from the sources and enabling JPEG support in gd took me awhile to figure out.
Somewhere especially configure --help should have stated that --with-jpeg-dir is MANDATORY if you want to have JPEG support. And even if you did so, it doesn't mean you'll get it. If it's wrongly configured, no error is going to be output, all you get is "no JPEG support". What's more confusing is when JPEG support is disabled phpinfo won't say "JPEG Support: disabled", but just omit the entry so you won't even realize something is wrong.
If you recompile PHP or gd, make sure:
- rm -f config.cache FIRST
- make clean (this helps A LOT), actually you can just delete modules/gd.*, and every *.o in ext/gd. this part actually gave me the best headache
- ./configure --with-jpeg-dir=/usr/lib OR any other directory which contains the BINARY library of libjpeg
- make, make install
phpinfo should now display jpeg support... good luck.
(you lucky guys who already have PHP 5 installed on your server... you don't have to go through all the mess I had)


jezu

I have noticed that Nokia's old camera-phones create non-standard JPEG's.
Nokias' JPEG doesn't end with 0xFFD9. Add 0xFFD9 end of file and image works fine with imagecreatefromjpeg(). Willertan1980 already sent code to do that.


linus

I am using PHP 4.3.8 and GD 2.0.23-compatible, and this function does not return an empty string on failure as stated. This line:
<?php
var_dump(imagecreatefromjpeg('bogus filename'));
?>
outputs:
bool(false)
Of course this doesn't matter unless you're using a strict comparison operator to evaluate the result, but I thought I'd point it out.


office

Here's the answer for your 256 color only problem!!!
use these functions in order then it works fine!
$img_src=imagecreatefromjpeg('yoursource.jpg');
$img_dst=imagecreatetruecolor(20,20);
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, 20, 20, 20, 20);
imagejpeg($img_dst, $g_dstfile, 100);
imagedestroy($img_dst);
Greetz, GTB


30-jun-2004 12:55

here is my clear method to resize images
you can check how it works on http://www.jetevents.pl
<?php
  $maxx=100;    // maximum width
  $maxy=75;    // maximum height
  $name=strtolower(substr($_FILES['file']['name'],0,-4)).".jpg";  // name of file - must be jpg
    $size = GetImageSize ($_FILES['file']['tmp_name']);        // params of image
  if ($size[0]>$size[1]) {$sizemin[0]=$maxx;$sizemin[1]=$maxy;};
  if ($size[1]>$size[0]) {$sizemin[0]=$maxy;$sizemin[1]=$maxx;};
 
  $im=@imagecreatefromjpeg($path);                // path to your gallery
  $small = imagecreatetruecolor($sizemin[0], $sizemin[1]);    // new image
  ImageCopyResampled($small, $im, 0, 0, 0, 0, $sizemin[0], $sizemin[1], $size[0], $size[1]);
  // below is main function resampling image
  ImageDestroy($im);                        // free memory
  if (ImageJPEG($small,$path,100))                // try to save image
      {
      echo "File $path has been written
\n";            // success
      echo "size: ".$sizemin[0]."x".$sizemin[1] ."
\n";
      }
    else
      {
      echo "<font color=red><b>";                    // failed to write file
      echo "Error ! File has not been written.";
      echo "</b></font>
\n";
      };
?>


elyoukey

here is a code, inspired by the button of
tl at comvironment dot com
but here, you can make as many buttons as you need by cutting the image in as many parts as defined in the table
<?php
class Button_Array{
var $tab_button = array();// the text of each button you want to create
var $im;//the image file

function Button_Array($fileName, $tab_string){
$this -> tab_button = $tab_string;
$this -> im = $fileName;

//parameters
$font  = 10;
//cut the full image in X parts
//X = the number of buttons you want
$imgFull=ImageCreateFromJPEG($this -> im);
list($width, $heightFull, $type, $attr) = getimagesize($this -> im);

$height = round($heightFull/sizeof($this->tab_button),0);

for ($i=0;$i<sizeof($this->tab_button);$i++ ) {
$pos=$i*$height;

$imgParts[$i]=ImageCreateTrueColor($width,$height);
if(imagecopy($imgParts[$i],$imgFull,0,0,0,$pos,$width,$height)){

//manips
$textColor = imagecolorallocate ($imgParts[$i],0,20,90);
ImageString ($imgParts[$i],$font,200,10,$this->tab_button[$i],$textColor);

//création du fichier
ImageJPEG($imgParts[$i] , $this->tab_button[$i].'.jpg',85);
}
}
}
}
$tab[]="topic1";
$tab[]="topic2";
$tab[]="topic3";
$tab[]="topic4";
$tab[]="more topics";
$tabButton=new Button_Array("a.jpg",$tab);
echo "<table border=0 cellspacing=0 cellpadding=0>";
foreach ($tab as $source) {
echo "<tr><td><img src='$source.jpg'></td></tr>";
}
echo "</table>";
?>


yaroukh

Hello Karolis
My solution was intended to solve situations when your webhoster puts a limit on the memory usage; in such a situations ini_set doesn't work ofcourse (even for variables that have 'PHP_INI_ALL' flag in a typical PHP-installation).
Have a nice day
 Yaroukh


lordneon

For Windows users who wants to enable the GD libary:
It took me some while to figure this out, but in the end it worked (and still does) great.
1. First download the latest (stable recommended) version of php
2. Unzip to f.ex c:\php\
3. Now you should have a file in c:\php\ that's named php.ini.dist (or something like that). Rename that to php.ini and copy it to the root of you Windows directory.
4. Open the php.ini file (the easiers way is to open the run promnt at your start menu and just type php.ini and hit enter).
5. Search (ctrl+f) for extension_dir. The default value is set to "./", make it to "./extensions"
6. Now you need to find where in the php.ini the modules for Windows is located. Search for gd.
7. Remove the ; char infront of this line: extension=php_gd2.dll
8. Try make a php script with some image functions and see if it works. F.ex $im = imageCreate("test.jpg");
If you get a message that says something like imageCreate function doesn't exist the gd libary is not loaded.
9. That's all. Have fun using GD in Windows :)


infonospam

For those having trouble getting jpeg support using gd, make sure you
rm config.cache
before reconfiguring php. Otherwise the configure script will assume jpeg support is still not compiled into gd.


dmhouse

For a script that allows you to calculate the "fudge factor" discussed below by Karolis and Yaroukh, try the following. Grab a few images, preferably some large ones (the script should cope with images of up to 10 megapixels or so), some small ones, and some ones in between. Add their filenames to the $images array, then load the script in your browser.
<?php
header('Content-Type: text/plain');
ini_set('memory_limit', '50M');
function format_size($size) {
 if ($size < 1024) {
   return $size . ' bytes';
 }
 else {
   $size = round($size / 1024, 2);
   $suffix = 'KB';
   if ($size >= 1024) {
     $size = round($size / 1024, 2);
     $suffix = 'MB';
   }
   return $size . ' ' . $suffix;
 }
}
$start_mem = memory_get_usage();
echo <<<INTRO
The memory required to load an image using imagecreatefromjpeg() is a function
of the image's dimensions and the images's bit depth, multipled by an overhead.
It can calculated from this formula:
Num bytes = Width * Height * Bytes per pixel * Overhead fudge factor
Where Bytes per pixel = Bit depth/8, or Bits per channel * Num channels / 8.
This script calculates the Overhead fudge factor by loading images of
various sizes.
INTRO;
echo "\n\n";
echo 'Limit: ' . ini_get('memory_limit') . "\n";
echo 'Usage before: ' . format_size($start_mem) . "\n";
// Place the images to load in the following array:
$images = array('image1.jpg', 'image2.jpg', 'image3.jpg');
$ffs = array();
echo "\n";
foreach ($images as $image) {
 $info = getimagesize($image);
 printf('Loading image %s, size %s * %s, bpp %s... ',
        $image, $info[0], $info[1], $info['bits']);
 $im = imagecreatefromjpeg($image);
 $mem = memory_get_usage();
 echo 'done' . "\n";
 echo 'Memory usage: ' . format_size($mem) . "\n";
 echo 'Difference: ' . format_size($mem - $start_mem) . "\n";
 $ff = (($mem - $start_mem) /
        ($info[0] * $info[1] * ($info['bits'] / 8) * $info['channels']));
 $ffs[] = $ff;
 echo 'Difference / (Width * Height * Bytes per pixel): ' . $ff . "\n";
 imagedestroy($im);
 $start_mem = memory_get_usage();
 echo 'Destroyed. Memory usage: ' . format_size($start_mem) . "\n";
 echo "\n";
}
echo 'Mean fudge factor: ' . (array_sum($ffs) / count($ffs));
?>


yaroukh

Estimated memory needed for ImageCreateFromJPEG
First I supposed simple width*height*bpp will be enough, it isn't though; there is some pretty big overhead.
$imageInfo = GetImageSize($imageFilename);
$memoryNeeded = Round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);
With memory_limit enabled running out of memory causes script to crash; above written will tel you how much memory you're gonna need for creating an image-resource out of image-file. So in conjunction with Memory_Get_Usage() and Get_CFG_Var('memory_limit') you can avoid the mentioned ending. (Yet there won't be too many images blocked from processing that would still fit in the memory, as the results of this are pretty accurate.)


tom

Doing a "make clean", regardless of which platform you're on (including MacOS X) should clean up the source tree enough to ensure that config changes take effect...

willertan1980

did you found that sometimes it hang the php when imagecreatefromjpeg() run on bad JPEG. I found that this is cause by the JPEG file U used dont have EOI (end of image)
the FF D9 at the end of your JPEG
JPEG image should start with 0xFFD8 and end with 0xFFD9
// this may help to fix the error
function check_jpeg($f, $fix=false ){
# [070203]
# check for jpeg file header and footer - also try to fix it
if ( false !== (@$fd = fopen($f, 'r+b' )) ){
if ( fread($fd,2)==chr(255).chr(216) ){
fseek ( $fd, -2, SEEK_END );
if ( fread($fd,2)==chr(255).chr(217) ){
fclose($fd);
return true;
}else{
if ( $fix && fwrite($fd,chr(255).chr(217)) ){return true;}
fclose($fd);
return false;
}
}else{fclose($fd); return false;}
}else{
return false;
}
}


webmaster

Concerning the path discussion. A relative path works just fine, if it is used properly. The thing is just to keep track of where in the file system you actually are calling the function from.
E.g. including file A into file B, and then executing file A. Now calls made in file B will act as if they actually are made file A, due to the inclusion. So a well designed filesystem is very important. Also moving a file might lead to this type of path related problems.
Hope this made any sence! :)


timpie2000

Be sure to allocate your colors AFTER you used this function or else you might get some strange colors..

paul

Basta/Justnoone:
GD no longer supports the GIF format due to legal issues with Unisys (they own the patent for LZW compression used in GIF). See the documentation for GD for more details:
http://www.boutell.com/gd/manual1.8.4.html


atapi103

As jpsy sugested Windows users can download the zip to get the gd2_dll extension
OR
If you already installed with the windows installer and are too lazy to get the zip you can go here
http://www.coupin.net/gd-freetype/windows.php
Download the php_gd2.dll file put it wherever you want, and change the
extension_dir=C:\php\extensions
Wherever you saved the dll to is the path you put in, remember to uncomment
extension=php_gd2.dll
Do not uncomment the one above for gd.dll (the one without the 2)


dmf four one fiive

Another thing to note, is the file not might actually be a jpeg , even though the filename ends in .jpg. If this is the case the command won't work. You will need imagecreatefromgif()
The easiest way to check is to use your favorite editor like vi.
On Line one it will tell you if its a gif or a jpg..
I took a quick look at a few image files. the gifs say GIF87a and the real jpegs should say JFIF or something like that.


johnbrook

Also, here is the same formula presented in a somewhat more human-readable way, if you'd rather:
<?php
$MB = Pow(1024,2);   // number of bytes in 1M
$K64 = Pow(2,16);    // number of bytes in 64K
$TWEAKFACTOR = 1.8;   // Or whatever works for you
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
                                       * $imageInfo['bits']
                                       * $imageInfo['channels'] / 8
                         + $K64
                       ) * $TWEAKFACTOR
                    );
$memoryHave = memory_get_usage();
$memoryLimitMB = (integer) ini_get('memory_limit');
$memoryLimit = $memoryLimit * $MB;
if ( function_exists('memory_get_usage')
    && $memoryHave + $memoryNeeded > $memoryLimit
  ) {
  $newLimit = $memoryLimitMB + ceil( ( $memoryHave
                                     + $memoryNeeded
                                     - $memoryLimit
                                     ) / $MB
                                   );
  ini_set( 'memory_limit', $newLimit . 'M' );
}
?>


jhon

// a function for resize the images(png,jpg,gif) in a directory
//for the png you must have the zlib actived
//$diror origin directory
//$dirdest destination directory
//$val value of resize(1,2,3..)
//$qual quality(80 if you don't know)
function imgres($diror,$dirdest,$val,$qual){
$q=$qual;
//open the directory
if (is_dir($diror)) {
  if ($dh = opendir($diror)) {
     while (($file = readdir($dh)) !== false) {
if($file == "." || $file == ".."){continue;}
    $k=explode(".",$file);
if(strpos($k[1],"jpg")===0 || strpos($k[1],"jpeg")===0){
$salva=$dirdest.$file;
           $image=$diror.$file;
$im =imagecreatefromjpeg("$image");
$x=imagesx($im);
$y=imagesy($im);
$thumbnail=imagecreatetruecolor($x/$val,$y/$val);
$im_ridimensionata=imagecopyresized( $thumbnail, $im, 0, 0, 0, 0, $x/$val,
$y/$val, $x, $y);
imagejpeg($thumbnail, $salva, $q);    
        }
elseif(strpos($k[1],"gif")===0){
$salva=$dirdest.$file;
           $image=$diror.$file;
$im =imagecreatefromgif("$image");
$x=imagesx($im);
$y=imagesy($im);
$thumbnail=imagecreatetruecolor($x/$val,$y/$val);
$im_ridimensionata=imagecopyresized( $thumbnail, $im, 0, 0, 0, 0, $x/$val,
$y/$val, $x, $y);
imagegif($thumbnail, $salva, $q);
}
elseif(strpos($k[1],"png")===0){
$salva=$dirdest.$file;
           $image=$diror.$file;
$im =imagecreatefrompng("$image");
$x=imagesx($im);
$y=imagesy($im);
$thumbnail=imagecreatetruecolor($x/$val,$y/$val);
$im_ridimensionata=imagecopyresized( $thumbnail, $im, 0, 0, 0, 0, $x/$val,
$y/$val, $x, $y);
imagepng($thumbnail, $salva, $q);
}
else{
echo "File not compatible(no jpg,gif or png)";
}
}
        closedir($dh);
    }
}
}


bpiere21

###--- imagecreatefromjpeg only opens JPEG files from your disk.
###--- To load JPEG images from a URL, use the function below.
function LoadJPEG ($imgURL) {
##-- Get Image file from Port 80 --##
$fp = fopen($imgURL, "r");
$imageFile = fread ($fp, 3000000);
fclose($fp);
##-- Create a temporary file on disk --##
$tmpfname = tempnam ("/temp", "IMG");
##-- Put image data into the temp file --##
$fp = fopen($tmpfname, "w");
fwrite($fp, $imageFile);
fclose($fp);
##-- Load Image from Disk with GD library --##
$im = imagecreatefromjpeg ($tmpfname);
##-- Delete Temporary File --##
unlink($tmpfname);
##-- Check for errors --##
if (!$im) {
print "Could not create JPEG image $imgURL";
}
return $im;
}
$imageData = LoadJPEG("http://www.example.com/example.jpg");
Header( "Content-Type: image/jpeg");
imagejpeg($imageData, '', 100);


Change Language


Follow Navioo On Twitter
gd_info
getimagesize
image_type_to_extension
image_type_to_mime_type
image2wbmp
imagealphablending
imageantialias
imagearc
imagechar
imagecharup
imagecolorallocate
imagecolorallocatealpha
imagecolorat
imagecolorclosest
imagecolorclosestalpha
imagecolorclosesthwb
imagecolordeallocate
imagecolorexact
imagecolorexactalpha
imagecolormatch
imagecolorresolve
imagecolorresolvealpha
imagecolorset
imagecolorsforindex
imagecolorstotal
imagecolortransparent
imageconvolution
imagecopy
imagecopymerge
imagecopymergegray
imagecopyresampled
imagecopyresized
imagecreate
imagecreatefromgd2
imagecreatefromgd2part
imagecreatefromgd
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromstring
imagecreatefromwbmp
imagecreatefromxbm
imagecreatefromxpm
imagecreatetruecolor
imagedashedline
imagedestroy
imageellipse
imagefill
imagefilledarc
imagefilledellipse
imagefilledpolygon
imagefilledrectangle
imagefilltoborder
imagefilter
imagefontheight
imagefontwidth
imageftbbox
imagefttext
imagegammacorrect
imagegd2
imagegd
imagegif
imagegrabscreen
imagegrabwindow
imageinterlace
imageistruecolor
imagejpeg
imagelayereffect
imageline
imageloadfont
imagepalettecopy
imagepng
imagepolygon
imagepsbbox
imagepsencodefont
imagepsextendfont
imagepsfreefont
imagepsloadfont
imagepsslantfont
imagepstext
imagerectangle
imagerotate
imagesavealpha
imagesetbrush
imagesetpixel
imagesetstyle
imagesetthickness
imagesettile
imagestring
imagestringup
imagesx
imagesy
imagetruecolortopalette
imagettfbbox
imagettftext
imagetypes
imagewbmp
imagexbm
iptcembed
iptcparse
jpeg2wbmp
png2wbmp
eXTReMe Tracker