在PHP中保存到磁盘之前计算映像文件大小

时间:2016-09-24 22:02:21

标签: php resize jpeg image-resizing

我正在试验PHP图像保存。 我想比较图片的实际文件大小上传前调整大小/压缩处理后,但想知道如果我将会是哪个文件大小将它保存到磁盘。

因此,如果文件大小较小,则新处理的文件将替换旧文件,否则不会进行任何更改。

这是我用来保存jpeg图像的代码。

imagejpeg($this->newImage, $savePath, $imageQuality);

我尝试在

之后获取实际的文件大小和大小
print_r(filesize($actual_file_size));
print_r($this->newImage);

其中 $ actual_file_size 通过读取tmp对象文件来提供数据,但 $ this-> newImage 给出空白(无值)。

我正在使用github

中的 ResizeImage

在保存到磁盘之前,有什么办法可以获取文件大小吗?这样我就可以保留最小尺寸的版本。

3 个答案:

答案 0 :(得分:0)

在将其保存到磁盘之前无法计算大小。我建议您创建某种temporary文件夹来保存图像,然后检查大小,如果它是你想要的,将它移动到你认为合适的文件夹,如果你不想保存它,删除它temporary文件夹。

答案 1 :(得分:0)

不是真的。 有办法..

以下代码与JPEG和PNG一起使用:-)

    ///######## GET THE TOTAL PIXELS
    $total_pixels   = $image_width * $image_height;
    $size_at_max    = (3 * $total_pixels) * 0.001; /// **** IN KB

答案 2 :(得分:0)

这是您的操作方式:

$original_file = 'original.jpg';
$resized_file = 'resized.jpg';
$max_file_size = '10000';

$original_image = imagecreatefromjpeg($original_file);

$image_quality = 100;

do {
    $temp_stream = fopen('php://temp', 'w+');
    $saved = imagejpeg($original_image, $temp_stream, $image_quality--);
    rewind($temp_stream);
    $fstat = fstat($temp_stream);
    fclose($temp_stream);

    $file_size = $fstat['size'];
}
while (($file_size > $max_file_size) && ($image_quality >= 0));

if (-1 == $image_quality) {
    echo "Unable to get the file that small. Best I could do was $file_size bytes at image quality 0.\n";
}
else {
    echo "Successfully resized $original_file to $file_size bytes using image quality $image_quality. Resized file saved as $resized_file.\n";
    imagejpeg($new_image, $resized_file, $image_quality + 1);
}

在成功找到理想的压缩率之前,不需要写入任何文件。

此循环以$ image_quality为100开始,然后递减尝试在临时内存缓冲区中尝试每个新值。如果下降到尝试0并且文件仍然太大,则会返回错误消息。否则,如果达到一个可行的值,它将报告该错误并使用该图像质量设置保存新文件。

如果您喜欢冒险,可以实施二进制搜索算法来更快地找到理想的压缩率,但是这种快速修复方法可以提供相同的结果,尽管可能慢一些。