PHP: создание обрезанных миниатюр изображений, проблем

Я довольно новичок в PHP, и я пишу сценарий, который будет изменять размеры изображений.

Сначала загруженное изображение изменяется на 800 * по высоте, в зависимости от ориентации загруженного файла (портрет / пейзаж).

Затем сценарий предназначен для создания миниатюры этого изображения. Миниатюра должна быть 175 Ширина на 117height. Это соответствует той же пропорции, что и стандартное jpeg-изображение с камер, которые снимают изображения, поэтому нет необходимости обрезать изображение для миниатюрной версии, если исходный файл является ландшафтным. Однако, когда загруженное изображение представляет собой портретную ориентацию, я должен обрезать изображение, чтобы получить эскиз 175x117px. При обрезке мне нужно поддерживать центр изображения (в отличие от верхнего левого, нижнего правого и т. Д.),

У меня возникают серьезные проблемы с этим, и я действительно буду вечно благодарен, если кто-то не возражает, чтобы потратить время, чтобы просмотреть мой код и помочь мне! : D

Сайт можно найти на сайте hybridtempo.net. Помните, что в базе данных есть довольно случайное дерьмо, где мне приходилось вводить случайные данные и исчерпывать идеи, lol.

Кажется, что все работает нормально до самого нижнего уровня, где я начинаю использовать функции imagecopyresize, imagecreatetruecolore, 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> 

Посмотрите пример 1 : по следующему URL. Он показывает очень простой скрипт для изменения размеров изображений в PHP:

http://us.php.net/manual/en/function.imagecopyresized.php