Php 根据最大文件大小缩放图像
我正在使用Imagick,并且喜欢将图像缩放到最大文件大小2.5MB 我看了一下这个SOF问题:这正是我想要做的,但是Imagick中的Php 根据最大文件大小缩放图像,php,imagick,image-scaling,image-size,gmagick,Php,Imagick,Image Scaling,Image Size,Gmagick,我正在使用Imagick,并且喜欢将图像缩放到最大文件大小2.5MB 我看了一下这个SOF问题:这正是我想要做的,但是Imagick中的extent()方法没有size参数: 有人知道我怎么能做到吗?目前,我试图计算原始文件大小和目标文件大小之间的系数,以计算新的分辨率,但发现分辨率与文件大小不成正比 更新-输出格式始终为JPEG格式,因此如果在保存之前有办法计算大小,那就太好了 提前感谢,Maxime您调用的扩展函数仅用于设置图像的大小 设置jpeg范围选项的功能是: $imagick->
extent()
方法没有size参数:
有人知道我怎么能做到吗?目前,我试图计算原始文件大小和目标文件大小之间的系数,以计算新的分辨率,但发现分辨率与文件大小不成正比
更新-输出格式始终为JPEG格式,因此如果在保存之前有办法计算大小,那就太好了
提前感谢,Maxime您调用的扩展函数仅用于设置图像的大小 设置jpeg范围选项的功能是:
$imagick->setOption('jpeg:extent', '2500kb');
有趣的是,设置此选项后,$imagick->getImageBlob()函数似乎崩溃了。您被迫将文件写入磁盘,而不是直接获取其字节
输出格式始终为JPEG格式,因此,如果在保存之前有一种计算大小的方法,那就太好了
没有。对于给定的图像质量,每个图像中的细节量决定了压缩后图像的大小。因此,不可能计算出最终尺寸的质量等级
限制文件大小的基础Image Magick库中的C代码为:
maximum=101;
for (minimum=2; minimum < maximum; )
{
jpeg_image->quality=minimum+(maximum-minimum+1)/2;
status=WriteJPEGImage(jpeg_info,jpeg_image);
if (GetBlobSize(jpeg_image) <= extent)
minimum=jpeg_image->quality+1;
else
maximum=jpeg_image->quality-1;
}
}
最大值=101;
用于(最小值=2;最小值<最大值;)
{
jpeg_图像->质量=最小值+(最大最小值+1)/2;
状态=WriteJPEG图像(jpeg\U信息,jpeg\U图像);
如果(GetBlobSize(jpeg_图像)质量+1;
其他的
最大值=jpeg_图像->质量-1;
}
}
也就是说,它只是以不同的图像质量级别重新压缩文件,直到找到给定值的可接受文件大小的级别。谢谢Danack,id
WriteJPEGImage
和GetBlobSize
是PHP函数吗?还是只是关于Imagick如何处理$Imagick->setOption的附加信息('jpeg:extent','2500kb');
?@maxwell2022,来自Imagick允许您在PHP中使用的图像Magick库-这就是C代码。Imagick函数将是Imagick::writeImage($filename);
然后是filesize($filename)。这可能需要大量磁盘访问才能保存一个映像。是否有方法根据两次首次写入来估计质量。即q:100=fs:3000Kb
和q:99=fs:2900kb
因此,请尝试q:95
,您应该有一个fs:2500kb
,如果fs
仍然过高,请根据新的映像来估计质量结果…?您当然可以自由地创建自己的算法,但我认为不可能精确地预测某个压缩质量级别的数据将如何使用。感谢您的帮助,我将在未来几天实现一些功能,并用它更新我的问题。