PHP图像调整大小 - 为什么图像已上传但未调整大小?

时间:2010-03-12 10:02:14

标签: php image resize

背景
我有一个上传图像的脚本。一个用于保留原始图像,另一个用于调整图像大小。 1.如果图像尺寸(宽度和高度)在最大尺寸范围内,我使用简单的“复制”直接到文件夹UserPics。 2.如果原始尺寸大于最大尺寸,我想将宽度和高度调整到最大值。 它们都将图像上传到文件夹,但在案例2中,图像不会调整大小。

QUESTION
脚本有问题吗?
设置有问题吗?

设置
服务器:WAMP 2.0
PHP:5.3.0
PHP.ini:启用GD2,内存= 128M(已尝试1000M)
尝试上传的imagetypes:jpg,jpeg,gif和png(所有这些都是相同的结果)

SCRIPT

if (isset($_POST['adduserpic'])) {  
    // Check errors on file  
    if ($_FILES["file"]["error"] > 0) {  
        echo $_FILES["file"]["error"]." errors<br>";  
    } else {  
        $image =$_FILES["file"]["name"];  
        $uploadedfile = $_FILES["file"]["tmp_name"];  
    //Uploaded image  
    $filename = stripslashes($_FILES['file']['name']);  

    //Read filetype  
    $i = strrpos($filename,".");  
    if (!$i) { return ""; }  
    $l = strlen($filename) - $i;  
    $extension = substr($filename,$i+1,$l);  
    $extension = strtolower($extension);  

    //New picture name = maxid+1 (from database)  
    $query = mysql_query("SELECT MAX(PicId) AS number FROM userpictures");  
    $row = mysql_fetch_array($query);  
    $imagenumber = $row['number']+1;  

    //New name of image (including path)   
    $image_name=$imagenumber.'.'.$extension;    
    $newname = "UserPics/".$image_name;  

    //Check width and height of uploaded image  
    list($width,$height)=getimagesize($uploadedfile);  

    //Check memory to hold this image (added only as checkup)   
    $imageInfo = getimagesize($uploadedfile);   
    $requiredMemoryMB = ( $imageInfo[0] * $imageInfo[1] * ($imageInfo['bits'] / 8) * $imageInfo['channels'] * 2.5 ) / 1024;  
    echo $requiredMemoryMB."<br>";  

    //Max dimensions that can be uploaded  
    $maxwidth = 20;  
    $maxheight = 20;  

    // Check if dimensions shall be original  
    if ($width > $maxwidth || $height > $maxheight) {  
        //Make jpeg from uploaded image  
        if ($extension=="jpg" || $extension=="jpeg" || $extension=="pjpeg" ) {  
            $modifiedimage = imagecreatefromjpeg($uploadedfile);  
        } elseif ($extension=="png") {  
            $modifiedimage = imagecreatefrompng($uploadedfile);  
        } elseif ($extension=="gif") {  
            $modifiedimage = imagecreatefromgif($uploadedfile);  
        }   
        //Change dimensions  
        if ($width > $height) {  
            $newwidth = $maxwidth;  
            $newheight = ($height/$width)*$newwidth;  
        } else {  
            $newheight = $maxheight;  
            $newwidth = ($width/$height)*$newheight;  
        }  

        //Create new image with new dimensions  
        $newdim = imagecreatetruecolor($newwidth,$newheight);  
        imagecopyresized($newdim,$modifiedimage,0,0,0,0,$newwidth,$newheight,$width,$height);  
        imagejpeg($modifiedimage,$newname,60);  

        // Remove temp images  
        imagedestroy($modifiedimage);  
        imagedestroy($newdim);  
    } else {  
        // Just add picture to folder without resize (if org dim < max dim)  
        $newwidth = $width;  
        $newheight = $height;  
        $copied = copy($_FILES['file']['tmp_name'], $newname);  
    }

    //Add image information to the MySQL database  
    mysql_query("SET character_set_connection=utf8", $dbh);  
    mysql_query("INSERT INTO userpictures (PicId, Picext, UserId, Width, Height, Size) VALUES('$imagenumber', '$extension', '$_SESSION[userid]', '$newwidth', '$newheight', $size)") 

3 个答案:

答案 0 :(得分:0)

乍一看我看不出脚本有什么问题,但如果没有一些测试输出和错误报告,这很难解决。

  1. 调高error_reporting(E_ALL)

  2. 查看$newname设置为

  3. 的内容
  4. 查看copy()命令的作用

  5. 我敢打赌,当你打开错误报告时,你会得到一些东西。 顺便说一下,要找出文件的扩展名,我会使用pathinfo

答案 1 :(得分:0)

您是否检查过实际使用过图像大小调整块?考虑一些调试输出。我看不出任何明显的错误

if ($width > $maxWidth || etc...) {
   echo "Hey, gotta shrink that there image";
   ... do the resizing ...
   $resizedImage = getimagesize($newname);
   var_dump($resizedImage); // see if the new image actually exists/what its stats are
   etc....
} else {
   echo "Woah, that's a small picture, I'll just make a straight copy instead";
}

您可能还想将$ newheight / $ newwidth四舍五入为整数值 - 在几乎所有情况下,您都会获得一些小数结果,而且图像没有小数像素。

顺便说一句,你的身份证号码生成器已经出现了竞争状况:

$query = mysql_query("SELECT MAX(PicId) AS number FROM userpictures");  
$row = mysql_fetch_array($query);  
$imagenumber = $row['number']+1; 

考虑几乎同时完成两次上传的情况。他们都会得到相同的身份证号码(比方说25)。然后,无论哪个上传需要更长的时间来处理,都会“赢”并覆盖更快的上传。

考虑使用以下逻辑重写数据库部分以使用事务:

 1. start transaction
 2. insert skeleton record into the db and get its ID
 3. do image processing, copying, saving, etc...
 4. update record with the new image's stats
 5. commit the transaction

这样,事务将“隐藏”记录,因为它尚未提交,两个或多个同时上传无法获得相同的ID号,如果在图像处理过程中出现任何故障(ram,磁盘空间不足,腐败的源图像等...)你只需回滚事务并清理混乱。

答案 2 :(得分:0)

1)检查权限。确保运行Web进程的用户可以编写UserPics目录(例如,debian系统上的www-data)。我不熟悉Windows上的系统权限,但这就是我自己要检查的内容(我有,而且我可能已经这样做了)。

2)本身不相关,但请查看http://sourceforge.net/projects/littleutils/

我在所有上传的图片上运行opt-gif和opt-jpg以节省磁盘空间(我的应用程序不需要丢失的内容)