自动在 Imagick 中设置压缩级别以达到最大文件大小

gor*_*dyr 5 php imagemagick imagick

我正在检索图像上传时的大小 Imagick:

$im->getImageSize();
Run Code Online (Sandbox Code Playgroud)

这将返回图像的大小(以字节为单位)。

我想自动设置压缩级别,以便文件大小永远不会超过特定大小。如果我想限制为 70kb,允许的最小压缩级别为 60(范围为 0-100),我会首先执行以下操作:

 public function getCompLevel($size)
 {
                    $maxsize = 70000; // Set rough max size of file
                    $mincomp = 60;   // Set minimum compression level allowed


                    if($size > $maxsize ){   // If file size exceeds max allowed size, perform calculation
                        $comp = **EQUATION**
                    }

        return ($comp < $mincomp) ? $mincomp : $comp; // if output is less than minimum allowed compression , return minimum.  If not return calculated compression level
 }
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是根据文件大小计算所需压缩级别的近似值所需的方程。我知道由于颜色影响文件大小,这可能不太准确,但我想尽可能接近。

任何帮助将不胜感激。

Sam*_*ook 3

我喜欢这个问题,虽然确实没有正确答案。我复制了多个实例,其中变量$x表示从零开始的文件大小,并增加到最大文件大小的两倍。此外,我还创建了一个变量$equalizer。该变量呈指数级增长,而将其设置为100将创建更高的压缩级别,或者越接近0将创建更大的间隙。

<?php
$max_file_size = 70000;
$max_compression = 60;
$equalizer = 100;

for($x=0;$x<$max_file_size+$max_file_size;$x+=10000){
    if($x < $max_file_size){
        echo $max_compression.'<br>';
    }else{
        echo $max_compression - (($x / $max_compression * $max_file_size) / ($max_file_size * $max_compression * $equalizer)).'<br>';
    }

}?>
Run Code Online (Sandbox Code Playgroud)

在您的现实世界情况中,我想象您的函数看起来像这样:

<?php
function getCompLevel($size){
    $maxsize = 70000;
    $compression = 60;
    $equalizer = 100;

    if($size > $maxsize ){
        $compression = $compression - (($size / $compression * $maxsize) / ($maxsize * $compression * $equalizer));
    }

    return $compression;
}?>
Run Code Online (Sandbox Code Playgroud)