【问题标题】:How can I upload/resize images taken with a digital camera?如何上传/调整用数码相机拍摄的图像?
【发布时间】:2010-10-20 00:44:26
【问题描述】:

我正在建造一个画廊,目标是降低进入门槛。我的用户是使用数码相机拍照的人,因此每张图像的文件大小在 200 - 400 KB 之间。

我在使用 GD 库时遇到的问题是,当服务器有 64 MB 的限制时,每个图像在调整大小和上传时使用大约 90MB 的内存+。

当我使用 ImageMagick 时,它会超时并引发内部服务器错误。

我想知道是否有人在上传/调整如此大的图像尺寸方面有任何经验,可以给我一些指示。

谢谢,
列维

编辑:这是我要上传的代码

     /** Begin Multiple Image Upload**/     
        $numberImages = count($_FILES['galFile']['name'])-1;

for($i=1;$i<=$numberImages;$i++)
{
$imageName = $_FILES['galFile']['name'][$i];
            $imageType = $_FILES['galFile']['type'][$i];
            $imageSize = $_FILES['galFile']['size'][$i];
            $imageTemp = $_FILES['galFile']['tmp_name'][$i];
            $imageError = $_FILES['galFile']['error'][$i];

            //Make sure it is an image
            if(in_array(end(explode(".", $imageName)), $allowed))
            {
                 //Where to upload image to
                 $uploadFile = $uploadDir . $imageName;
                 if (file_exists($uploadFile))
        {
            //What to do if file already exists
            //Append random number to the end
            $front = explode(".", $imageName);
            $randomNum = rand(1,100);
            $front[0] = $front[0].$randomNum;
            $imageName = $front[0].".".$front[1];
            $uploadFile = $uploadDir . $imageName;
        }
                  if(move_uploaded_file($imageTemp,$uploadFile))
                  {
                  //Add $imageName to DB
                   $query = "INSERT INTO galleryImages VALUES(\"0\",\"$lastInsert\",\"$imageName\",\"$i\")";
               mysql_query($query);
               reSizePic($uploadFile);
                  }
            }
}

这是我用来调整大小的 GD 代码:

function reSizePic($image)
{
$source_pic = $image;
$destination_pic = $image;
$max_width = 660;
$max_height = 500;

$src = imagecreatefromjpeg($source_pic);
list($width,$height)=getimagesize($source_pic);

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;

if(($width <= $max_width) && ($height <= $max_height))
{
    $tn_width = $width;
    $tn_height = $height;
}
elseif (($x_ratio * $height) < $max_height)
{
    $tn_height = ceil($x_ratio * $height);
    $tn_width = $max_width;
}
else
{
    $tn_width = ceil($y_ratio * $width);
    $tn_height = $max_height;
}

$tmp = imagecreatetruecolor($tn_width,$tn_height);

imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);

imagejpeg($tmp,$destination_pic,100);
imagedestroy($src);
imagedestroy($tmp);
}

这是我用来调整大小的 ImageMagick 代码:

$resource = NewMagickWand(); 
MagickReadImage($resource,$image); 
MagickSetImageCompressionQuality( $resource, 100);
$resource = MagickTransformImage($resource,'0x0','660x500');
MagickWriteImage($resource, $image);
DestroyMagickWand($resource);

【问题讨论】:

  • 您可能在做一些低效的事情,因为 ImageMagick 应该能够毫无问题地处理 400kb 的图像。您要一次调整多少个?你能发布你的代码吗?
  • 我假设您正在打开一个文件但没有关闭它或其他什么来获得那么多内存使用。可以发布您的代码吗?
  • 我不会过多地依赖 200-400KB - 如今 3.2 到 5 兆像素的手机摄像头很常见。
  • GD 和 ImageMagick 都应该能够非常轻松地处理相当大的文件。你的代码看起来不错。事实上,我经常使用 GD 来调整 3-4 MB 图像的大小。我可以在具有 1.5 GB 内存的 2ghz 机器上在大约 5-6 秒内完成一批大约 10 个 4 MB 的文件。没什么特别的。听起来您的服务器上存在配置问题,而不是编程错误。附带说明一下,那里存在一些相当严重的数据库安全问题。阅读:en.wikipedia.org/wiki/Sql_injection
  • "具有 1.5 GB 的 RAM。没什么特别的。" vs“服务器有 64 MB 的限制。”。运行一个 64mb ini_set 试试。检查我的计算答案。

标签: php image gd imagemagick


【解决方案1】:

http://pl.php.net/imagecreatefromjpeg

加载图像所需的内存 使用 imagecreatefromjpeg() 是 图像尺寸的函数和 图像的位深度,乘以 开销。它可以从计算 这个公式:Num bytes = Width * 高度 * 每像素字节数 * 开销 fudge 因子 其中每像素字节数 = 位深度/8,或每通道位数 * Num 频道 / 8.

关于 GD 部分。现在ImageMagick:你有没有尝试过更简单的方法:

$thumb = new Imagick('image.jpg');
$thumb->resizeImage($w,$h,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('thumb.jpg');
$thumb->destroy(); 

【讨论】:

  • ImageMagick 的上述内容不起作用。它说,“致命错误:找不到类 'Imagick'”我正在使用 Hostgator 并且他们安装了 Magickwand,你知道这是否意味着我只能使用 Magickwand 命令吗?
  • 从文档 cmets 中获取这个例子,如果你安装了 magick 包,我认为它应该可以工作。
  • 我为上传的前 15 张图片调整图片大小的代码。如果我上传超过 15 个,它不会结束,所以我相信这与服务器和某种超时有关。
【解决方案2】:

请把下面的代码放在你的 php 文件的顶部。

ini_set("memory_limit","500M");

【讨论】:

    【解决方案3】:

    我对这个问题一无所知,但是下面的答案有用吗

    What is the best way to handle photo uploads?

    万一它不是,忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2018-01-19
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多