Main Page
 The gatekeeper of reality is
 quantified imagination.

Stay notified when site changes by adding your email address:

Your Email:

Bookmark and Share
Email Notification
Project CURL Images
Purpose
The purpose of this project is to demonstrate how to use PHP and CURL to get an image URL and resize it. This is useful in a variety of web applications today and may be useful in maintenance endeavors for your own website.

Making a GET Request
$thumbmaxwidth = 75; /* Width of the thumbnail image */
$thumbmaxheight = 75; /* Height of the thumbnail image */
$normalmaxwidth = 200; /* Width of the "mid-sized" image */
$normalmaxheight = 200; /* Height of the "mid-sized" image */
$Rimgbackgroundcolor = 255; /* In RGB, red index to fill the background with (behind image) */
$Gimgbackgroundcolor = 255; /* In RGB, green index to fill the background with (behind image) */
$Bimgbackgroundcolor = 255; /* In RGB, blue index to fill the background with (behind image) */
$err_msg = ""; /* Errors are collected with this variable */
$tempfilename = ""; /* Name of the file used to temporary stage the retrieved file so it can be worked on */
$normalfilename = ""; /* Final name of the smaller size of the original image */
$thumbfilename = ""; /* Final name of the thumbnail size of the original image */
$itemimageurl = ""; /* The full URL (e.g., http://) to the image to have resized */
$curluseragent = "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"; /* User agent to identify this image retriever as */

$filePath = "";
/* Grab filepath and modify so we dump the data to the folder "tmpimgs" located one directory above the current directory this script is in */
$filePathRaw = dirname(__FILE__);
$filePathSegments = explode("/", $filePathRaw);
for ($x = 1; $x < (sizeof($filePathSegments) - 1); $x++) {
$filePath = $filePath . "/" . $filePathSegments[$x];
}
$filePath = $filePath . "/tmpimgs";

/* Define the names of the files used in the raw image copy process */
$tempfilename = "raw"; /* Does not need to be a filename with extension on Linux */
$normalfilename = "200x200.jpg"; /* Final name of the smaller size of the original image */
$thumbfilename = "75x75.jpg"; /* Final name of the thumbnail size of the original image */

$itemimageurl = "http://www.somesite.com/someimage.jpg";

/* Perform simple validation */
$protocolpos = -1;
$protocolpos = strpos(strtolower($itemimageurl), "http");
if ($protocolpos != 0) { $itemimageurl = ""; }
if (strlen($itemimageurl) > 255) { $itemimageurl = ""; }

/* Begin Processing */
if (strlen($itemimageurl) > 0) {
/* Retrieve the image */
$err_status = "";
$tempfilelocation = $filePath . "/" . $tempfilename;
$curl = curl_init();
$fp = fopen($tempfilelocation, "w");
curl_setopt($curl, CURLOPT_URL, $itemimageurl);
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_USERAGENT, $curluseragent);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_MAXREDIRS, 2);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects, the number of which is defined in CURLOPT_MAXREDIRS
curl_setopt($curl, CURLOPT_FORBID_REUSE, TRUE);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, TRUE);
curl_exec($curl);
$err_status = curl_error($curl);
curl_close($curl);
fclose($fp);

/* Continue if no error */
if (strlen($err_status) == 0) {
/* Load information regarding the local image */
list($width, $height, $type, $attr) = getimagesize($tempfilelocation);

/* Place image into the temporary working area */
$imgdata = null;
/* NOTE: $type contains a numeric value instead of the IMAGETYPE_ string value. Anotated here for reference PHP 4.3.0+. */
/*
$type values:
1 IMAGETYPE_GIF
2 IMAGETYPE_JPEG
3 IMAGETYPE_PNG
4 IMAGETYPE_SWF
5 IMAGETYPE_PSD
6 IMAGETYPE_BMP
7 IMAGETYPE_TIFF (intel)
8 IMAGETYPE_TIFF (motorola)
9 IMAGETYPE_JPC
10 IMAGETYPE_JP2
11 IMAGETYPE_JPX
12 IMAGETYPE_JB2
13 IMAGETYPE_SWC
14 IMAGETYPE_IFF
15 IMAGETYPE_WBMP
16 IMAGETYPE_XBM
*/
switch($type) {
case 1:
$imgdata = imagecreatefromgif($tempfilelocation);
break;
case 2:
$imgdata = imagecreatefromjpeg($tempfilelocation);
break;
case 3:
$imgdata = imagecreatefrompng($tempfilelocation);
break;
case 16:
$imgdata = imagecreatefromxbm($tempfilelocation);
break;
default:
break;
}
$hasimg = 0;
if ($imgdata === false) {
/* We don't have an image */
$hasimg = -1;
}
else { $hasimg = 1; }

/* Continue if we have either a gif, jpeg, png or xbm */
if ($hasimg == 1) {
/* Create thumbnail and resize the original as may be needed */
$originalaspectratio = $width / $height;
/* STEP 1: NORMAL RESIZE OF ORIGINAL */
$normalaspectratio = 0;
$normalwidth = 0;
$normalheight = 0;
$xletterbox = 0;
$yletterbox = 0;
/* Initial resize retaining proportions */
if ($height > $width) {
$originalaspectratio = $normalmaxheight / $height;
$normalheight = $normalmaxheight;
$normalwidth = $width * $originalaspectratio;
$xletterbox = round(($normalmaxwidth - $normalwidth) / 2);
}
elseif ($height == $width) {
$originalaspectratio = $normalmaxheight / $height;
$normalheight = $normalmaxheight;
$normalwidth = $width * $originalaspectratio;
$xletterbox = round(($normalmaxwidth - $normalwidth) / 2);
}
else {
$originalaspectratio = $normalmaxwidth / $width;
$normalheight = $height * $originalaspectratio;
$normalwidth = $normalmaxwidth;
$yletterbox = round(($normalmaxheight - $normalheight) / 2);
}
/* Generate the resized image (as JPG) */
$normalimage = imagecreatetruecolor($normalmaxwidth, $normalmaxheight);
$bgcolor = imagecolorallocate($normalimage, $Rimgbackgroundcolor, $Gimgbackgroundcolor, $Bimgbackgroundcolor);
imagefill($normalimage, 0, 0, $bgcolor);
imagecopyresampled($normalimage, $imgdata, $xletterbox, $yletterbox, 0, 0, $normalwidth, $normalheight, $width, $height);
imagejpeg($normalimage, $filePath . "/" . $normalfilename, 90);
imagedestroy($normalimage);

/* STEP 2: THUMBNAIL RESIZE OF ORIGINAL */
$thumbaspectratio = 0;
$thumbwidth = 0;
$thumbheight = 0;
$xletterbox = 0;
$yletterbox = 0;
/* Initial resize retaining proportions */
if ($height > $width) {
$thumbaspectratio = $thumbmaxheight / $height;
$thumbheight = $thumbmaxheight;
$thumbwidth = $width * $thumbaspectratio;
$xletterbox = round(($thumbmaxwidth - $thumbwidth) / 2);
}
elseif ($height == $width) {
$thumbaspectratio = $thumbmaxheight / $height;
$thumbheight = $thumbmaxheight;
$thumbwidth = $width * $thumbaspectratio;
$xletterbox = round(($thumbmaxwidth - $thumbwidth) / 2);
}
else {
$thumbaspectratio = $thumbmaxwidth / $width;
$thumbheight = $height * $thumbaspectratio;
$thumbwidth = $thumbmaxwidth;
$yletterbox = round(($thumbmaxheight - $thumbheight) / 2);
}

/* Generate the resized image (as JPG) */
$thumbimage = imagecreatetruecolor($thumbmaxwidth, $thumbmaxheight);
$bgcolor = imagecolorallocate($thumbimage, $Rimgbackgroundcolor, $Gimgbackgroundcolor, $Bimgbackgroundcolor);
imagefill($thumbimage, 0, 0, $bgcolor);
imagecopyresampled($thumbimage, $imgdata, $xletterbox, $yletterbox, 0, 0, $thumbwidth, $thumbheight, $width, $height);
imagejpeg($thumbimage, $filePath . "/" . $thumbfilename, 90);
imagedestroy($thumbimage);
}
else {
/* We do not have a gif, jpeg, png or xbm file to work with */
$err_msg = "The image needs to be in either a GIF, JPEG, PNG or XBM format.";
}
} /* END: if (strlen($err_status) == 0) */
else {
/* A problem occurred attempting to retrieve the file */
$err_msg = "An error occurred: " . $err_status . ".";
}
/* Remove temporary file, if present */
if (file_exists($tempfilelocation)) { unlink($tempfilelocation); }
} /* END: if (strlen($itemimageurl) > 0) */
else {
/* The URL location to the file does not appear to have been included */
$err_msg = "The URL to the image does not appear to have been included or is improperly formatted.";
}
print $err_msg;


About Joe