Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.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 根据最大文件大小缩放图像_Php_Imagick_Image Scaling_Image Size_Gmagick - Fatal编程技术网

Php 根据最大文件大小缩放图像

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->

我正在使用Imagick,并且喜欢将图像缩放到最大文件大小2.5MB

我看了一下这个SOF问题:这正是我想要做的,但是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
仍然过高,请根据新的映像来估计质量结果…?您当然可以自由地创建自己的算法,但我认为不可能精确地预测某个压缩质量级别的数据将如何使用。感谢您的帮助,我将在未来几天实现一些功能,并用它更新我的问题。