2013-02-19 110 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