如何使用PHP和GD获取图像资源的字节大小?

7

我正在使用php gd调整图片大小。结果是我想要上传到Amazon S3的图像资源。如果我先将图像存储在磁盘上,它可以很好地工作,但我希望直接从内存中上传它们。只要我知道图像的字节大小,就可以实现这一点。

有没有办法获得gd图像资源的大小(以字节为单位)?

5个回答

14

您可以使用PHP的内存I/O流将图像保存,然后获取以字节为单位的大小。

您需要执行以下操作:

$img = imagecreatetruecolor(100,100);
// do your processing here
// now save file to memory
imagejpeg($img, 'php://memory/temp.jpeg'); 
$size = filesize('php://memory/temp.jpeg');

现在你应该知道尺寸大小了。

我不知道任何(使用gd)方法来获取图像资源的大小。


1
问题在于gd函数需要一个路径而不是文件资源来进行写入。但是,可以使用输出缓冲来解决这个问题。 - deceze
@deceze:你应该能够提供这样的路径:php://memory/resource=img.jpeg - Dennis Haarbrink
2
啊,不错!虽然这将使用双倍的内存,因此不是最佳选择,但是是一个不错的替代方案 :) - Martin

11

我无法使用imagepng函数将内容写入php://memory,因此我使用ob_start()、ob_get_content()和ob_end_clean()。

$image = imagecreatefrompng('./image.png'); //load image
// do your processing here
//...
//...
//...
ob_start(); //Turn on output buffering
imagejpeg($image); //Generate your image

$output = ob_get_contents(); // get the image as a string in a variable

ob_end_clean(); //Turn off output buffering and clean it
echo strlen($output); //size in bytes

1
为什么不像@JonathanWren建议的那样使用ob_get_length呢? - Wilt

9
这也是可以实现的:
$img = imagecreatetruecolor(100,100);

// ... processing

ob_start();              // start the buffer
imagejpeg($img);         // output image to buffer
$size = ob_get_length(); // get size of buffer (in bytes)
ob_end_clean();          // trash the buffer

现在,$size将显示你的大小(以字节为单位)。


谢谢。这对我很有帮助,因为我需要一种在上传文件之前确定文件大小的方法。 - Benjamin

0
你可以查看以下答案以获取帮助。它适用于 PHP 中通用的内存更改。虽然可能涉及开销,但这可能更多是估计。 获取 PHP 对象的大小

-1

这是英文版本:http://www.php.net/manual/en/function.filesize.php :) - Alex Rashkov
将临时文件保存在磁盘上正是我试图避免的。 - Martin
为什么?这并不是一个很大的性能问题,而且可以节省很多内存。 - joni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接