获得未压缩的图像大小

时间:2015-11-07 23:52:48

标签: php image thumbnails gd filesize

我有一个小的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 个答案:

答案 0 :(得分:0)

尝试在重新调整尺寸之前查看原始图像尺寸?也许将它乘以基于平均格式压缩的设定%?

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

在做任何工作之前看着它?

次要想法

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