具有目标文件大小的PHP GD Jpeg
我想为PHP/GD提供一个图像资源和一个目标文件大小,并让它输出一个目标大小的JPEG文件。比如说,我有一个500KB的PNG图像,需要100KB 例如具有目标文件大小的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 } 我知道我已经看到了一个用于此的函数,如果可能的话,我不打算重新发明它。如果您可以访问命令行,我建议您
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
.为什么不是二进制的?