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


Scale image according a maximum file size

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

我看了一下这个 SOF 问题:ImageMagick:用最大文件大小缩放 JPEG 图像,这正是我想做的,但 Imagick 的extent()方法没有大小参数:http://www.php.net/manual/en/imagick.extentimage.php

有谁知道我怎么做?目前,我正在尝试计算原始文件大小和目标文件大小之间的系数以计算新的分辨率,但发现分辨率与文件大小不成比例。

更新 - 输出格式始终为 JPEG,因此如果有一种方法可以在保存之前计算大小,那就太好

提前感谢,马克西姆

您调用的范围函数只是为了设置图像的大小。

设置 jpeg 范围选项的函数为:

$imagick->setOption('jpeg:extent', '2500kb');

有趣的是,函数 $imagick->getImageBlob() 在设置此选项后似乎崩溃了。您被迫将文件写入磁盘,而不是能够直接获取其字节。

输出格式始终为 JPEG,因此如果有一种方法可以在保存之前计算大小,那就太好了

没有。对于给定的图像质量,每个图像中的细节量决定了压缩后图像的大小。因此,无法计算出最终尺寸的质量水平。

底层图像魔术库中限制文件大小的 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;
    }
}

即,它只是以不同的图像质量级别重新压缩文件,直到找到为给定值提供可接受的文件大小的级别。