压缩并调整上传的图像

时间:2015-04-04 08:56:57

标签: php image

我有一个上传文件高达8MB的功能,但现在我还想压缩或至少重新缩放较大的图像,因此我的输出图像不会超过100-200 KB和1000x1000px分辨率。如何在我的函数中实现压缩和重新缩放(比例)?

function uploadFile($file, $file_restrictions = '', $user_id, $sub_folder = '') {
    global $path_app;
    $new_file_name    = generateRandomString(20);

    if($sub_folder != '') {
        if(!file_exists('media/'.$user_id.'/'.$sub_folder.'/')) {
            mkdir('media/'.$user_id.'/'.$sub_folder, 0777);
        }
        $sub_folder = $sub_folder.'/';
    }
    else {
        $sub_folder = '';
    }

    $uploadDir  = 'media/'.$user_id.'/'.$sub_folder;
    $uploadDirO = 'media/'.$user_id.'/'.$sub_folder;
    $finalDir   = $path_app.'/media/'.$user_id.'/'.$sub_folder;

    $fileExt    = explode(".", basename($file['name']));
    $uploadExt  = $fileExt[count($fileExt) - 1];
    $uploadName = $new_file_name.'_cache.'.$uploadExt;
    $uploadDir  = $uploadDir.$uploadName;

    $restriction_ok = true;
    if(!empty($file_restrictions)) {
        if(strpos($file_restrictions, $uploadExt) === false) {
            $restriction_ok = false;
        }
    }
    if($restriction_ok == false) {
        return '';
    }
    else {
        if(move_uploaded_file($file['tmp_name'], $uploadDir)) {
            $image_info     = getimagesize($uploadDir);
            $image_width    = $image_info[0];
            $image_height   = $image_info[1];

            if($file['size'] > 8000000) {
                unlink($uploadDir);
                return '';
            }
            else {
                $finalUploadName    = $new_file_name.'.'.$uploadExt;
                rename($uploadDirO.$uploadName, $uploadDirO.$finalUploadName);

                return $finalDir.$finalUploadName;
            }
        }
        else {
            return '';
        }
    }
}

3 个答案:

答案 0 :(得分:1)

对于重新缩放,我使用这样的函数:

function dimensions($width,$height,$maxWidth,$maxHeight)
// given maximum dimensions this tries to fill that as best as possible
{
  // get new sizes
  if ($width > $maxWidth) { 
    $height = Round($maxWidth*$height/$width);  
    $width  = $maxWidth;  
  }
  if ($height > $maxHeight) { 
    $width  = Round($maxHeight*$width/$height); 
    $height = $maxHeight; 
  }
  // return array with new size
  return array('width' => $width,'height' => $height);
}

压缩由PHP函数完成:

  // set limits
  $maxWidth  = 1000;
  $maxHeight = 1000;
  // read source
  $source = imagecreatefromjpeg($originalImageFile);
  // get the possible dimensions of destination and extract
  $dims = dimensions(imagesx($source),imagesy($source),$maxWidth,$maxHeight);
  // prepare destination
  $dest = imagecreatetruecolor($dims['width'],$dims['height']);
  // copy in high-quality
  imagecopyresampled($dest,$source,0,0,0,0,
                     $width,$height,imagesx($source),imagesy($source));
  // save file
  imagejpeg($dest,$destinationImageFile,85);
  // clear both copies from memory
  imagedestroy($source);
  imagedestroy($dest);

您必须提供$originalImageFile$destinationImageFile。这个东西来自我使用的类,所以我编辑了很多,但基本功能就在那里。我遗漏了任何错误检查,所以你仍然需要添加它。请注意85中的imagejpeg()表示压缩量。

答案 1 :(得分:1)

你可以通过imagemagic library使用一个简单的单行解决方案,命令会像这样

$image="path to image";
$res="option to resize"; i.e 25% small , 50% small or anything else
exec("convert ".$image." -resize ".$res." ".$image);

使用此功能,您可以旋转 调整大小以及许多其他图片自定义

答案 2 :(得分:0)

查看imagecopyresampled(),还有一个如何实现它的示例,对于压缩,请查看imagejpeg()第三个参数有助于设置图像的质量, 100意味着(最好的质量,最大的文件)如果你跳过最后一个选项,那么默认质量是75,这是好的并压缩它。