2013-02-19 79 views
4

快速簡介。我們目前必須根據我們網站上的產品圖片製作小型,中型和大型圖像。不是一個關於PHP的知識我認爲我仍然會嘗試自動化這個噩夢。PHP上傳大圖像和調整像Photoshop一樣的比例

圖像上傳,我們和拇指的尺寸低於

800 width x 1400 width LARGE 
300 width x 525 width THUMB 

與我的PHP腳本的問題是,它只是擴展到比例調整大小。我希望它能像Photoshop一樣縮小比例,只需點擊shift和圖像縮放。我正嘗試使用imagecopyresized,但運氣不佳。

<?php 
// PHP UPLOAD SCRIPT 

// VALIDATION OF FORM 

if($_FILES['user_image']['type'] == "image/jpeg" && $_FILES['user_image']['size'] < 3000000) 
{ 
    // VARS 
    $target_folder = 'images/'; 
    $upload_image = $target_folder.basename($_FILES['user_image']['name']); 

    // UPLOAD FUNCTION 
    if(move_uploaded_file($_FILES['user_image']['tmp_name'], $upload_image)) 
    { 

     // VARS FOR FILE NAMES 
     $thumbnail = $target_folder."medium_x.jpg"; 
     $actual = $target_folder."large_x.jpg"; 

     // THUMBNAIL SIZE 
     list($width, $height) = getimagesize($upload_image); 
     $newwidth = "300"; 
     $newheight = "525"; 

     // VARS FOR CALL BACK 
     $thumb = imagecreatetruecolor($newwidth, $newheight); 
     $source = imagecreatefromjpeg($upload_image); 

     // RESIZE WITH PROPORTION LIKE PHOTOSHOP HOLDING SHIFT 
     imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

     // MAKE NEW FILES 
     imagejpeg($thumb, $thumbnail, 100); 

     // FILE RENAMES 
     rename($upload_image, $actual); 

     { 

      // SUCCESS MESSAGES 
      ?> 

      <p> 
       Image Successfully uploaded!<br /> 
       Actual image: <?=$actual;?><br /> 
       Thumbnail image: <?=$thumbnail;?><br /> 

       <h1>Large</h1> 
       <img src="<?=$actual;?>"/><br /><br /> 
       <h1>Medium</h1> 
       <img src="<?=$thumbnail;?>"/><br /><br /> 
      </p> 

      <? 
     } 
     // FAILED MESSAGES 
    } 
    else 
    { 
     echo 'Upload failed.'; 
    } 
} 
else 
{ 
     // NOT A JPEG 
     echo 'Not a JPEG'; 
} 

// END OF SCRIPT 
?> 

如何在沒有拉伸圖像的情況下正確調整大小?可能嗎?

回答

8

無需PHP代碼桶即可實現這一點的最簡單方法是使用Image Magick。查看示例和示例命令行這裏:http://www.imagemagick.org/Usage/resize/#fill

編輯(使用EXEC()或類似的PHP可以調用):執行標準如下:

if($_FILES['user_image']['type'] == "image/jpeg" && $_FILES['user_image']['size'] < 3000000) 
{ 
    // VARS 
    $target_folder = 'images/'; 
    $upload_image = $target_folder.basename($_FILES['user_image']['name']); 

    $thumbnail = $target_folder."medium_x.jpg"; 
    $actual = $target_folder."large_x.jpg"; 

    $newwidth = "300"; 
    $newheight = "525"; 

    if(move_uploaded_file($_FILES['user_image']['tmp_name'], $upload_image)) 
    { 
     exec('convert '.$upload_image.' -resize '.$newwidth.'x'.$newheight.'^ '.$thumbnail); 
     rename($upload_image, $actual); 
    } 
} 
... 
etc 

你可以優化你的方式處理上傳,但我不想完全改變代碼的結構,因爲我不知道它是什麼。但基本上,你將圖像推送到ImageMagick的convert,它會發揮它的魔力。

如果您想裁剪以及規模,exec命令是:

exec('convert '.$upload_image.' -resize '.$newwidth.'x'.$newheight.'^ -gravity center -extent '.$newwidth.'x'.$newheight.' '.$thumbnail);

+0

我怎麼能融入我的腳本中的命令行功能。你是說用上面鏈接中的引用替換'imagecopyresized'命令嗎? – TheBlackBenzKid 2013-02-19 12:38:08

+0

我將編輯我的答案以向您展示實施 – LuckySpoon 2013-02-19 22:59:37

+0

無需執行命令行命令即可使用該命令。 Imagick已經包裝在一個不錯的php庫 – pdizz 2013-02-19 23:42:48