PHP上传大图片并按比例缩放,如Photoshop

4

简要介绍。我们目前需要根据网站上的产品图片制作小、中、大三种不同尺寸的图片。由于我对PHP并不是很熟悉,因此我想尝试自动化这个恶梦。

我们上传的图片和缩略图的尺寸如下:

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
?>

我如何在不拉伸图像的情况下正确调整大小?这是否可能?

2个回答

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('convert '.$upload_image.' -resize '.$newwidth.'x'.$newheight.'^ -gravity center -extent '.$newwidth.'x'.$newheight.' '.$thumbnail);


我该如何在我的脚本中集成命令行功能?你是说用上面链接中的引用替换imagecopyresized命令吗? - TheBlackBenzKid
不需要执行命令行命令来使用它。Imagick已经包含在一个很好的PHP库中。 - pdizz
命令行更快、文档更完善。我不明白为什么要添加PHP开销,当一个简单的exec()就可以完成所有的繁重工作? - LuckySpoon
喜欢这个非常简单的选项,不会使我的PHP代码混乱。谢谢! - Ethan Allen

1

抱歉,我该如何实现这个? - TheBlackBenzKid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接