Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP GD在上传前调整/裁剪图像_Php_Image_Upload_Resize_Php Gd - Fatal编程技术网

PHP GD在上传前调整/裁剪图像

PHP GD在上传前调整/裁剪图像,php,image,upload,resize,php-gd,Php,Image,Upload,Resize,Php Gd,我一直在尝试从一个HTML表单中获取一个文件,然后创建一个新的文件,并使用imagecopyresampled从中获取中心正方形,根据哪个更小,在X或Y上拟合 不幸的是,我对处理如此多的图像和临时名称感到有点困惑,并且在将文件复制到系统上的用户文件时遇到了麻烦。 代码如下: if($_FILES){ $valid = validate_image("avatar"); if ($valid){ list($width, $height, $type) = get

我一直在尝试从一个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。您还可以使用magic常量指定相对于执行PHP文件的路径


就裁剪而言,考虑使用预构建的函数或库来生成缩略图。我可以在这里复制一些代码,但是其他人已经多次将这个问题击死,并修复了其他潜在的问题,比如透明度。您可以查看文档和用户评论,或者使用复杂的库,例如。

因此,在在线研究了很多之后,我发现最大的问题是运行apache www数据的用户

因此,我输入/etc/apache2/envvars并将APACHE_RUN_用户更改为文件夹的所有者。 然后我不得不在/etc/lib/php5上做一个chown,这样会话就可以与新用户一起使用了

有了它,我现在可以访问这个文件夹,这样服务器就可以对它进行写入和修改。 然后我在代码中添加了以下部分:

$dir = "./users/$id/";
$oldumask = mask(0); 
mkdir ("$dir");
chmod("$dir", 0750);
umask($oldumask);
这是在创建png图像之前添加的。 然后,我删除了move_上传的文件代码,只使用了Jacob Budin建议的imagepng函数:

if(!imagepng($upload, $name)) $fail .= "<h3>ERROR!<h3><br>";
这解决了所有问题,但裁剪代码是错误的,但这并不重要。 我仍然不能100%确定GD/PHP如何很好地处理图像,但这是可行的。
谢谢大家,圣诞快乐。

我错了。它不是/users/$id/avatar.png。我在编辑代码时删除了太多内容,应该是相对于PHP文件的路径/users/$id/avatar.png。因此,用户文件夹位于PHP代码所在的同一目录中。