繁体   English   中英

在上传之前,PHP GD调整大小/裁剪图像

[英]PHP GD resize/crop image before uploading

我一直在尝试从HTML表单中获取文件,然后创建一个新文件,然后使用“ imagecopyresampled”从中获取中心正方形,以适合X或Y(取决于哪个较小)为宜。

不幸的是,我对处理这么多的图像和临时名称有些困惑,而且我一直很难将文件复制到系统上的用户文件中。 代码如下:

if($_FILES){
    $valid = validate_image("avatar");

    if ($valid){
        list($width, $height, $type) = getimagesize($_FILES['avatar']['tmp_name']);

        $scale = $width/$height;
        $pixels = 150;
        $tmp_name = $_FILES['avatar']['tmp_name'];

        switch ($type) {
            case IMAGETYPE_GIF:
                $source = imagecreatefromgif($tmp_name);
                break;

            case IMAGETYPE_JPEG:
            case IMAGETYPE_JPG:
                $source = imagecreatefromjpeg($tmp_name);
                break;

            case IMAGETYPE_PNG:
                $source = imagecreatefrompng($tmp_name);
                break;
        }

        $upload = imagecreatetruecolor($pixels, $pixels);

        //sketchy image math: Get whichever coordinate is smaller and that will be 150 on the thumbnail from top to bottom (or left to right).
        //Then for the other one you know the size will be 150, but only for the part starting at (Coordinate/2)-SMALLERCOORD/2 to (coord/2)+SMALLERCOORD/2

        if ($width>$height){
            imagecopyresampled ($upload, $source, 0, 0, 0, ($width-$height/2), 150, 150, $height, $height);
        } else if ($width<=$height){
            imagecopyresampled ($upload, $source, 0, 0, 0, ($height-$width/2), 150, 150, $width, $width);
        }

        $name = "./users/$id/avatar.png";

        imagepng($upload, $tmp_name);

        if (!(move_uploaded_file($tmp_name, $name))) $fail .= "<h3>ERROR UPLOADING AVATAR. TRY AGAIN LATER OR CONTACT US.</h3><br>";
    }
}

首先,让我看一下我是否了解代码如何正常工作:获取文件,检查其功能是否有效。 然后我得到它的大小和类型。 我检查类型,并根据它在服务器内存上创建一个映像,并在我想要的大小上创建另一个空映像。 然后,我实际上将调整大小和裁剪后的图像复制到我创建的上传图像上。 如果我想在那里可以删除带有imagedestroy的临时“源”图像,对吗? 接下来,我尝试从服务器内存中的“上传”图像制作一个png文件。 这是我认为错了的地方,无法覆盖临时文件,可以吗? 然后,我尝试将图像临时图像放在应该上载的位置,但这不起作用。

我说对了吗? 如何解决此代码? 感谢您的关注。

有关生成缩略图的逻辑不正确,但是更紧迫的问题是保存图像文件。 您正在尝试保存在文件系统的根目录( /users/$id/avatar.png )中,可能没有这样做所需的权限。

虽然您可以保存回上载路径,但这不是必需的。 imagepng ,只需将文件保存到目标位置即可(例如/var/web/app/public/uploads/$id/avatar.png )。 您还可以使用魔术常数__DIR__来指定相对于执行PHP文件的路径。

就裁剪而言,请考虑使用预建函数或库来生成缩略图。 我可以在此处复制一些代码,但是其他人已经多次将此问题打死(并纠正了其他潜在问题,例如透明度)。 您可以查看有关imagecopyresampled的文档(和用户评论),或使用诸如Imagine之类的复杂库。

因此,在进行大量在线研究之后,我发现最大的问题出在运行apache(www-data)的用户身上。

因此,我输入了/ etc / apache2 / envvars并将APACHE_RUN_USER更改为该文件夹的所有者。 然后,我必须在/ etc / lib / php5上执行chown,以便会话可以与新用户配合使用。

这样,我现在可以访问该文件夹,以便服务器可以在该文件夹上进行写和修改。 然后我将这部分添加到代码中:

$dir = "./users/$id/";
$oldumask = mask(0); 
mkdir ("$dir");
chmod("$dir", 0750);
umask($oldumask);

这是在创建png图像之前添加的。 然后我删除了“ move_uploaded_file”代码,并按照Jacob Budin的建议使用了imagepng函数:

if(!imagepng($upload, $name)) $fail .= "<h3>ERROR!<h3><br>";

这解决了所有问题(但是裁剪代码错误,但这无关紧要)。 我仍然不能百分百确定GD / PHP如何很好地处理图像,但这是可行的。 谢谢大家,祝大家圣诞节快乐。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM