我對PHP很新,我正在編寫一個腳本來調整圖像大小。PHP:創建裁剪圖像的縮略圖,問題
首先根據上傳文件的方向(縱向/橫向)將上傳的圖像調整爲800 * 800 *寬度。
該腳本然後意味着創建該圖像的縮略圖。縮略圖的高度必須是175英寸。這與拍攝照片的相機的標準jpeg圖像具有相同的比例,因此如果原始文件爲橫向,則無需爲縮略圖版本裁剪圖像。但是,當上傳的圖像是縱向時,我必須剪裁圖像才能實現175x117px的縮略圖。裁剪時,我需要保持圖像的中心(相對於左上角,右下角等)
我在做這件事時遇到了很大的麻煩,如果有人會介意,我會非常感激有時間查看我的代碼並幫助我! :D
該網站可以在hybridtempo.net找到。注意數據庫中有一些非常隨意的東西,我不得不輸入隨機數據並且跑出想法,哈哈。
一切似乎工作正常,直到非常接近底部,我開始使用'imagecopyresize','imagecreatetruecolour','imagecreatefromjpeg'等功能。
非常感謝任何貢獻。 :)
事不宜遲:
<?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>
歡迎SO。你不是真的問你一個問題嗎?你卡在哪裏?什麼不應該如此? – 2010-04-19 19:57:45
使用ImageMagick可能會有更好的運氣http://www.imagemagick.org/Usage/thumbnails/ – 2010-04-19 19:58:12