获取未压缩的图像大小

Posted

技术标签:

【中文标题】获取未压缩的图像大小【英文标题】:Getting the uncompressed image size 【发布时间】:2016-02-08 22:09:29 【问题描述】:

我有一个小的 php 脚本,可以将图像文件转换为缩略图。我的上传器最大为 100MB,我想保留它。

问题是,当打开文件时,GD 会解压它,导致它变得很大并且导致 PHP 内存不足 (Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 64000 bytes))。我不想将我的内存增加超过这个允许的大小。

我不关心图像,我可以让它显示默认缩略图,这很好。但是我确实需要一种方法来捕获错误imagecreatefromstring(file_get_contents($file)) 当图像太大时产生。

由于产生的错误是致命的,它不能被尝试捕获,并且由于它在一个命令中加载它,我不能继续关注它以确保它没有接近限制。在尝试处理图像之前,我需要一种方法来计算图像的大小。

有没有办法做到这一点? filesize 不起作用,因为它给了我压缩后的大小......

我的代码如下:

$image = imagecreatefromstring(file_get_contents($newfilename));
$ifilename = 'f/' . $string . '/thumbnail/thumbnail.jpg';

$thumb_width = 200;
$thumb_height = 200;

$width = imagesx($image);
$height = imagesy($image);

$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;

if ( $original_aspect >= $thumb_aspect )

    // Image is wider than thumbnail.
    $new_height = $thumb_height;
    $new_width = $width / ($height / $thumb_height);

else

    // Image is taller than thumbnail.
    $new_width = $thumb_width;
    $new_height = $height / ($width / $thumb_width);


$thumb = imagecreatetruecolor( $thumb_width, $thumb_height );

// Resize and crop
imagecopyresampled($thumb,
                   $image,
                   0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
                   0 - ($new_height - $thumb_height) / 2, // Center the image vertically
                   0, 0,
                   $new_width, $new_height,
                   $width, $height);
imagejpeg($thumb, $ifilename, 80);

【问题讨论】:

【参考方案1】:

在重新调整大小之前尝试查看原始图像大小?也许将它乘以基于平均格式压缩的一组百分比?

$averageJPGFileRatio = 0.55;
$orgFileSize = filesize ($newfilename) * 0.55;

在做任何工作之前看看那个?

次要想法

这样计算:width * height * 3 = filesize 3 代表红色、绿色和蓝色值,如果您使用 alpha 通道使用 4 而不是 3 的图像。这应该可以让您非常接近地估计位图大小。不考虑标头信息,但在几个字节内应该可以忽略不计。

【讨论】:

以上是关于获取未压缩的图像大小的主要内容,如果未能解决你的问题,请参考以下文章

当我压缩从图库中获取的图像大小时,高度和宽度也会被压缩

如何获取 LZMA2 文件 (.xz / liblzma) 的未压缩大小

sh 获取bzip2未压缩文件大小,重新压缩bzip2存档...等

获取图像的压缩比

从远程服务器获取时的图像压缩

将图像大小压缩到 1.5 MB,同时发送到多部分 ios swift