Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.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 Jpeg_Php_Gd - Fatal编程技术网

具有目标文件大小的PHP GD Jpeg

具有目标文件大小的PHP GD Jpeg,php,gd,Php,Gd,我想为PHP/GD提供一个图像资源和一个目标文件大小,并让它输出一个目标大小的JPEG文件。比如说,我有一个500KB的PNG图像,需要100KB 例如 function target_image_filesize($im,$target_size){ //create gd image //return a new image resource of specified size } 我知道我已经看到了一个用于此的函数,如果可能的话,我不打算重新发明它。如果您可以访问命令行,我建议您

我想为PHP/GD提供一个图像资源和一个目标文件大小,并让它输出一个目标大小的JPEG文件。比如说,我有一个500KB的PNG图像,需要100KB

例如

function target_image_filesize($im,$target_size){
  //create gd image
  //return a new image resource of specified size
}

我知道我已经看到了一个用于此的函数,如果可能的话,我不打算重新发明它。

如果您可以访问命令行,我建议您使用它,速度非常快。我们在类似的应用程序中使用它。 在php系统中('convert…'); 或php库


GD速度非常慢,我们遇到了问题

关键在于指定合适的JPEG质量。但此参数从未定义,您可以阅读:

事实上,JPEG程序的质量等级甚至没有标准化

但是。。。可能有一个聪明的解决办法!但是需要做一点工作:

1) 拍摄一些PNG图像
2) 通过步骤1将其转换为质量在(比如)50到100之间的JPEG
3) 分析质量和文件大小之间的相关性-是否为二次型:
size~q*q
,或指数-
size~x^q
,或倒数-
size~1/q
或任何东西?
4) 构建一个通用表达式,从质量预测文件大小,反之亦然

5) 在此处发布结果:-)

jpeg的文件大小不仅仅取决于保存质量和分辨率。如果你有一张纯色的图像和一张照片,它们的文件大小会因jpeg压缩的工作原理而不同。不幸的是,您必须生成它,测试文件大小,然后确定是否需要重新生成。

如果其他人也有同样的问题,这应该会有所帮助

function make_jpeg_target_size($file,$saveDir,$targetKB){
    $imageInfo = getimagesize($file);
    $filename = array_shift(explode('.',basename($file)));
    switch($imageInfo['mime']){
        case 'image/jpeg':
            $src = imagecreatefromjpeg($file);
            break;
        case 'image/gif':
            $src = imagecreatefromgif($file);
            break;
        case 'image/png':
            $src = imagecreatefrompng($file);
            break;
    }
    $target = $targetKB*1024;
    $start_q = 1;
    $cur_q = 99;
    while($cur_q > $start_q){
        $temp_file = tempnam(sys_get_temp_dir(), 'checksizer');
        $out = imagejpeg($src, $temp_file, $cur_q);
        $size = filesize($temp_file);
        if($size <= $target){
            $s = $targetKB.'kb';
            $saveAs = str_replace("//","/",$saveDir.'/'.$filename.'-'.$s.'.jpg');
            copy($temp_file, $saveAs);
            unlink($temp_file);
            $cur_q=0;
        }
        $cur_q=$cur_q-1;
    }
    if($saveAs == ''){
        return false;
    }else{
        return $saveAs;
    }
}
函数make_jpeg_target_size($file、$saveDir、$targetKB){
$imageInfo=getimagesize($file);
$filename=array_shift(explode('.',basename($file));
开关($imageInfo['mime'])){
案例“图像/jpeg”:
$src=imagecreatefromjpeg($file);
打破
案例“image/gif”:
$src=imagecreatefromformgif($file);
打破
案例“image/png”:
$src=imagecreatefrompng($file);
打破
}
$target=$targetKB*1024;
$start_q=1;
$cur_q=99;
而($cur\u q>$start\u q){
$temp_file=tempnam(sys_get_temp_dir(),'checksizer');
$out=imagejpeg($src,$temp\u file,$cur\u q);
$size=filesize($temp\u文件);

如果($size您需要迭代执行。生成jpeg。检查文件大小。如果太大,请重复并减少质量设置。+1是一个非常有趣的问题。但是您没有指定是否要保留图像尺寸。只有jpeg质量可以操作?尺寸将保持不变。该函数的唯一真正目标是重新生成图像d图像的当前文件大小,如果超过限制,请使用GD降低质量,直到达到目标文件大小。函数的输出(针对我的特定需要)永远是JPEG。我有一个解决方案,但这个网站对回答你自己的问题有一个奇怪的政策…所以不让我把它作为答案发布。我会在几个小时后回来看看我是否可以分享它。这是如何回答这个问题的???例如,你如何通过指定文件大小来控制质量?嘿,这是沿
$cur\u q.为什么不是二进制的?