Hi there,
I am fairly new to PHP, and I am writing a script that will resize images.
First an uploaded image is resized to 800width by *height, depending on the orientation of the file uploaded (portrait/landscape).
The script is then meant to create a thumbnail of that image. The thumbnail must be 175width by 117height. This is has the same proportion as a standard jpeg image from the cameras that take the pictures, thus there is no need to crop the image for a thumbnail version if the original file is landscape. However, when the uploaded image is portrait orientation I must crop image to be able to achieve a thumbnail of 175x117px. When cropping, I need to maintain the center of the image (as opposed to the top left, bottom right, etc.)
I am having massive trouble doing this, and I would really be eternally grateful if someone would mind taking the time to look through my code and help me out! :D
The site can be found at hybridtempo.net. Beware that there is some pretty random shit in the database, where I had to enter random data and ran out of ideas, lol.
Everything seems to work fine until very near the bottom, where I begin to use the 'imagecopyresize', 'imagecreatetruecolour', 'imagecreatefromjpeg', etc. functions.
Thanks very much for any contribution. :)
Without further ado:
<?php
//IMAGE RESIZE FUNCTION CODE BEGIN - CODE FOUND AND APPROPRIATED FROM http://github.com/maxim/smart_resize_image/
function smart_resize_image($file,
$width = 0,
$height = 0,
$proportional = false,
$output = 'file',
$delete_original = true,
$use_linux_commands = false ) {
if ( $height <= 0 && $width <= 0 ) return false;
# Setting defaults and meta
$info = getimagesize($file);
$image = '';
$final_width = 0;
$final_height = 0;
list($width_old, $height_old) = $info;
# Calculating proportionality
if ($proportional) {
if ($width == 0) $factor = $height/$height_old;
elseif ($height == 0) $factor = $width/$width_old;
else $factor = min( $width / $width_old, $height / $height_old );
$final_width = round( $width_old * $factor );
$final_height = round( $height_old * $factor );
}
else {
$final_width = ( $width <= 0 ) ? $width_old : $width;
$final_height = ( $height <= 0 ) ? $height_old : $height;
}
# Loading image to memory according to type
switch ( $info[2] ) {
case IMAGETYPE_GIF: $image = imagecreatefromgif($file); break;
case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($file); break;
case IMAGETYPE_PNG: $image = imagecreatefrompng($file); break;
default: return false;
}
# This is the resizing/resampling/transparency-preserving magic
$image_resized = imagecreatetruecolor( $final_width, $final_height );
if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
$transparency = imagecolortransparent($image);
if ($transparency >= 0) {
$transparent_color = imagecolorsforindex($image, $trnprt_indx);
$transparency = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
imagefill($image_resized, 0, 0, $transparency);
imagecolortransparent($image_resized, $transparency);
}
elseif ($info[2] == IMAGETYPE_PNG) {
imagealphablending($image_resized, false);
$color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
imagefill($image_resized, 0, 0, $color);
imagesavealpha($image_resized, true);
}
}
imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);
# Taking care of original, if needed
if ( $delete_original ) {
if ( $use_linux_commands ) exec('rm '.$file);
else @unlink($file);
}
# Preparing a method of providing result
switch ( strtolower($output) ) {
case 'browser':
$mime = image_type_to_mime_type($info[2]);
header("Content-type: $mime");
$output = NULL;
break;
case 'file':
$output = $file;
break;
case 'return':
return $image_resized;
break;
default:
break;
}
# Writing image according to type to the output destination
switch ( $info[2] ) {
case IMAGETYPE_GIF: imagegif($image_resized, $output); break;
case IMAGETYPE_JPEG: imagejpeg($image_resized, $output); break;
case IMAGETYPE_PNG: imagepng($image_resized, $output); break;
default: return false;
}
return true;
}
//IMAGE RESIZE FUNCTION CODE END.
/******** IMAGE UPLOAD SCRIPT BEGIN ********/
//IF IMAGE IS JPEG OR PNG
if (($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
{
//IF THERE IS AN ERROR, DISPLAY THE MESSAGE
if ($_FILES["file"]["error"] > 0)
{
echo "<p>Error: " . $_FILES["file"]["error"] . "
<br />
Redirecting...
<br />
<br />
If you are not automatically redirected after 3 seconds, <b><a href='addproduct_uploadimage.php'>click here to try another upload.</a></p>";
//REDIRECT
echo "<META HTTP-EQUIV='refresh' CONTENT='3;URL=addproduct_uploadimage.php'>";
}
//OTHERWISE, PROCEED
else
{
//EXPLAIN CURRENT PROCESS TO USER
echo "<p>File Uploaded: " . $_FILES["file"]["name"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temporary file stored in: " . $_FILES["file"]["tmp_name"] . "</p><br /><br />";
//ABSOLUTE PATH OF FILE
$img_url = "/home/space_/hybridtempo.net/images/uploads/" . $_FILES["file"]["name"];
//IF FILE ALREADY EXISTS, TELL THE USER IT ALREADY EXISTS, REDIRECT TO TRY AGAIN
if (file_exists($img_url))
{
echo "<p>" . $_FILES["file"]["name"] . " already exists. Redirecting...
<br />
<br />
If you are not automatically redirected after 3 seconds, <b><a href='addproduct_uploadimage.php'>click here to try another upload.</a></p>";
echo "<META HTTP-EQUIV='refresh' CONTENT='3;URL=addproduct_uploadimage.php'>";
}
//IF FILE DOES NOT ALREADY EXIST, PROCEED...
else
{
//POSITION - FROM THE ABSOLUTE ROOT OF THE CLIENT'S WEBSPACE - FOR THE FILE TO GET STORED
$img_url = "/home/space_/hybridtempo.net/images/uploads/" . $_FILES["file"]["name"];
$thumb_url = "/home/space_/hybridtempo.net/images/uploads/thumbnails/" . $_FILES["file"]["name"];
//MOVE TEMPORARY FILE TO WHERE IT IT SHOULD BE STORED
move_uploaded_file($_FILES["file"]["tmp_name"], $img_url);
// FIND IMAGE WIDTH AND HEIGHT TO DETRMINE RESIZE DIMENSIONS
list($width, $height) = getimagesize($img_url);
// RESIZE BASED ON PORTRAIT OR LANDSCAPE ORIENTATION OF IMAGE
if ($width > $height)
{
smart_resize_image($img_url,
$width = 800,
$height = 0,
$proportional = true,
$output = 'file',
$delete_original = true,
$use_linux_commands = false );
// STORE URL OF IMAGE IN 'picture' TABLE in 'shop' DATABASE
mysql_connect("**************","***********","*****");
mysql_select_db("hybridtempo_shop");
$prod_id = $_SESSION["prod_id"];
$result = mysql_query ("INSERT INTO picture (prod_id,picture_url,picture_id) VALUES ('$prod_id', '$img_url', 'NULL')");
mysql_close();
smart_resize_image($img_url,
$width = 175,
$height = 117,
$proportional = false,
$output = $thumb_url,
$delete_original = false,
$use_linux_commands = false );
// STORE URL OF IMAGE IN 'picture' TABLE in 'shop' DATABASE
mysql_connect("******************","****************","***********");
mysql_select_db("hybridtempo_shop");
$prod_id = $_SESSION["prod_id"];
$result = mysql_query ("INSERT INTO picture (prod_id,thumbnail_url,picture_id) VALUES ('$prod_id', '$thumb_url', 'NULL')");
mysql_close();
}
else
{
smart_resize_image($img_url,
$width = 0,
$height = 700,
$proportional = true,
$output = 'file',
$delete_original = true,
$use_linux_commands = false );
// STORE URL OF IMAGE IN 'picture' TABLE in 'shop' DATABASE
mysql_connect("*********","**********","**********");
mysql_select_db("hybridtempo_shop");
$prod_id = $_SESSION["prod_id"];
$result = mysql_query ("INSERT INTO picture (prod_id,picture_url,picture_id) VALUES ('$prod_id', '$img_url', 'NULL')");
mysql_close();
$wrongsize_thumb_url = $_FILES["file"]["name"];
smart_resize_image ($img_url,
$width = 175,
$height = 0,
$proportional = true,
$output = $wrongsize_thumb_url,
$delete_original = false,
$use_linux_commands = false
);
//FUNCTION FROM WIDELY SUPPORTED GD LIBRARY, BUNDLED WITH PHP
$wrongsize_thumb_url = $_FILES["file"]["name"];
//CROP PORTRAIT THUMBNAILS, AS THEY ARE TOO TALL.
$image_for_resize = ImageCreateFromJpeg($wrongsize_thumb_url);
$temporary_image = imagecreatetruecolor(117,175);
imagecopyresized (
$temporary_image, $image_for_resize,
$destination_x_coordinate = 0,
$destination_y_coordinate = 0,
$source_x_coordinate = 0,
$source_y_coordinate = 58,
$destination_width = 175,
$destination_height = 117,
$source_width = 175,
$source_height = 261
);
imagejpeg ($image_for_resize, 'thumbnail_' . $_FILES["file"]["name"]);
imagedestroy ($wrongsize_thumb_url);
// STORE URL OF IMAGE IN 'picture' TABLE in 'shop' DATABASE
mysql_connect("************","*************","***************");
mysql_select_db("hybridtempo_shop");
$prod_id = $_SESSION["prod_id"];
$result = mysql_query ("INSERT INTO picture (prod_id,thumbnail_url,picture_id) VALUES ('$prod_id', '$thumb_url', 'NULL')");
mysql_close();
}
//EXPLAIN WHERE IMAGE AND THUMBNAIL WERE STORED AND INFORM OF IMINENT REDIRECT
echo "<p>Image stored in: " . $_img_url;
echo "<br />";
echo "<p>Thumbnail stored in: " . $thumb_url;
echo "<br /><br />";
// UNSET PROD_ID VARIABLE TO PREVENT MIXUPS IF ADDING ANOTHER PRODUCT
unset($_SESSION['prod_id']);
//REDIRECTION MESSAGE
echo "If you are not automatically redirected after 5 seconds, <b><a href='index.php'>click here to return to the homepage.</a></p>";
//REDIRECT TO HOMEPAGE
//echo "<META HTTP-EQUIV='refresh' CONTENT='5;URL=index.php'>";
}
}
}
else
{
echo "<p>Error: The file needs to be an image. Redirecting...
<br />
<br />
If you are not automatically redirected after 3 seconds, <b><a href='addproduct_uploadimage.php'>click here to try another upload.</a></b></p>";
//REDIRECT
echo "<META HTTP-EQUIV='refresh' CONTENT='3;URL=addproduct_uploadimage.php'>";
}
?>
</center>
</div>
<div class="nav_bar">
<p><i> ~<a href="index.php"> home </a>~
<a href="http://blog.hybridtempo.net/"> blog </a>~
<a href="shop.php"> shop </a>~
<a href="#"> sourcing </a>~ <!-- Navigation bar contents. !-->
<a href="#"> links </a>~
<a href="#"> about </a>~
<a href="#"> contact </a>~ </i></p>
</div>
</div>
<div id="bg">
<div>
<table cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="images/bg.jpg" alt=""/> <!-- Background image. Must match thumbnail on homepage navigation grid !-->
</td>
</tr>
</table>
</div>
</div>
</body>
</html>