在上传前调整图片大小的PHP代码

3

我不知道如何在PHP中调整图像大小,我的代码如下:

for ($index = 1; $index <= 2; $index++) { 

    if (!empty($_FILES["pic$index"]["name"])) {
        $ext = substr($_FILES["pic$index"]["name"], strrpos($_FILES["pic$index"]["name"], '.') + 1);
        $dir = "../gallery/$mkdir";

        HERE I NEED THE RESIZE OF THE TMP FILE OF IMAGE

        move_uploaded_file($_FILES["pic$index"]["tmp_name"] , "$dir/img-$index.$ext");

    }  

}

$mkdir = 相册文件夹的名称(有许多相册)。

$dir = 照片将被放置的位置。

$ext = 图像类型(png、gif或jpg)。

foreach循环运行两次,因为您可以上传两张图片。

这个脚本工作良好,我只需要调整大小,但我不知道该如何做...


2
请注意,在上传图片之前无法调整其大小 - 它需要上传以便php可以调整其大小。 - Adam Hopkinson
你确定吗?所以我必须上传并调整大小,然后再次上传? - Luis
嘿,因为600600像素的图像尺寸会比200200大。 - Luis
3
move_uploaded_file()并不会上传任何内容。它只是在上传后将文件从一个目录移动到另一个目录,在同一服务器上进行移动 - Your Common Sense
可能是在PHP中调整图像大小的重复问题。 - Kevin Brown-Silva
显示剩余3条评论
2个回答

12

这里是我用来调整图片大小的代码。

在我的情况下,我将原始文件名和缩略图文件名作为参数传递给函数。

你可以很容易地根据自己的情况进行调整。

public static function GenerateThumbnail($im_filename,$th_filename,$max_width,$max_height,$quality = 0.75)
{
// The original image must exist
if(is_file($im_filename))
{
    // Let's create the directory if needed
    $th_path = dirname($th_filename);
    if(!is_dir($th_path))
        mkdir($th_path, 0777, true);
    // If the thumb does not aleady exists
    if(!is_file($th_filename))
    {
        // Get Image size info
        list($width_orig, $height_orig, $image_type) = @getimagesize($im_filename);
        if(!$width_orig)
            return 2;
        switch($image_type)
        {
            case 1: $src_im = @imagecreatefromgif($im_filename);    break;
            case 2: $src_im = @imagecreatefromjpeg($im_filename);   break;
            case 3: $src_im = @imagecreatefrompng($im_filename);    break;
        }
        if(!$src_im)
            return 3;


        $aspect_ratio = (float) $height_orig / $width_orig;

        $thumb_height = $max_height;
        $thumb_width = round($thumb_height / $aspect_ratio);
        if($thumb_width > $max_width)
        {
            $thumb_width    = $max_width;
            $thumb_height   = round($thumb_width * $aspect_ratio);
        }

        $width = $thumb_width;
        $height = $thumb_height;

        $dst_img = @imagecreatetruecolor($width, $height);
        if(!$dst_img)
            return 4;
        $success = @imagecopyresampled($dst_img,$src_im,0,0,0,0,$width,$height,$width_orig,$height_orig);
        if(!$success)
            return 4;
        switch ($image_type) 
        {
            case 1: $success = @imagegif($dst_img,$th_filename); break;
            case 2: $success = @imagejpeg($dst_img,$th_filename,intval($quality*100));  break;
            case 3: $success = @imagepng($dst_img,$th_filename,intval($quality*9)); break;
        }
        if(!$success)
            return 4;
    }
    return 0;
}
return 1;
}

返回码只是用来区分不同类型的错误。

回顾那段代码,我不喜欢“魔法数字”技巧。我将不得不做出更改(例如使用异常)。

if (!empty($_FILES["pic$index"]["name"])) {
    $ext = substr($_FILES["pic$index"]["name"], strrpos($_FILES["pic$index"]["name"], '.') + 1);
    $dir = "../gallery/$mkdir";
    // Move it
    if(move_uploaded_file($_FILES["pic$index"]["tmp_name"] , "$dir/img-$index.$ext.tmp"))
    {
      // Resize it
      GenerateThumbnail("$dir/img-$index.$ext.tmp","$dir/img-$index.$ext",600,800,0.80);
      // Delete full size
      unlink("$dir/img-$index.$ext.tmp");
    }
} 

使用move_uploaded_file将其移动(推荐), 然后可以调整大小并发送到最终目的地。您甚至可能不需要".tmp", 您可以使用。

    // Move it
    if(move_uploaded_file($_FILES["pic$index"]["tmp_name"] , "$dir/img-$index.$ext"))
    // Resize it
      GenerateThumbnail("$dir/img-$index.$ext","$dir/img-$index.$ext",600,800); 

这个th_filename和im_filename是什么?另外,我可以删除“//让我们在需要的情况下创建目录...”吗? - Luis
这是图像文件的名称和缩略图文件的名称。“获取该图像,生成缩略图并保存在那里”。如果您确定目录已经存在,可以删除目录部分。 - Loïc Février
你确定这个函数没问题吗?你不能写成:if(!$src_im) return 3; 作为例子。 - Luis
1
@Luis:我已经修改了该函数,以测试move_uploaded_file的返回值。 - Loïc Février
我想按上箭头键一百次,@LoïcFévrier谢谢您。 - Husam
显示剩余9条评论

1
请注意,您正在处理的图片已经上传到服务器上了。实际上,您希望在将其存储在“安全位置”之前调整图片大小。 $_FILES["pic$index"]["tmp_name"] 可能是 /tmp/某个图片名称

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