2010-04-19 123 views
0

我對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> 
+0

歡迎SO。你不是真的問你一個問題嗎?你卡在哪裏?什麼不應該如此? – 2010-04-19 19:57:45

+1

使用ImageMagick可能會有更好的運氣http://www.imagemagick.org/Usage/thumbnails/ – 2010-04-19 19:58:12

回答