Java BufferedImage:提前计算内存大小

Java BufferedImage: Calculate Memory Size in Advance

我目前正在开发一个 Web 服务,它必须将 PDF 转换为图像、缩小这些图像并将每个比例分成不同的图块。

对于我们的大多数用户数据,图像尺寸都不是很大,整个过程适合内存。

但尤其是在将大型矢量化 PDF 转换为图像时,导致分辨率为 50k+ 乘以 50k 分辨率,一个 BufferedImage实例很容易达到 8GB 或更多内存。

因为它是一个网络服务器,我想并行处理尽可能多的请求(甚至同时进行缩放和平铺)——我需要一些内存控制术语。

我知道我可能必须在步骤之间将更大的图像存储到磁盘。实际上有一些有用的 BufferedImage 开源版本可以使用内存和磁盘(参见 BigBufferedImage)...但是存在性能权衡,特别是对于较小的图像。

90% 的时间我都可以在内存中毫无问题地完成所有事情。所以我想:如何提前计算出BufferedImage的内存大小?我查看了 Javadoc 并在谷歌上搜索了一段时间。我不是图像文件格式、颜色模型等方面的专家。不知道从哪里开始。任何人都可以指出我进行这些计算需要了解的事情、可能达到的准确度以及我还需要考虑什么吗?

一般来说,图像的 像素 所需的内存可以这样计算(伪代码):

memoryNeeded = ceil(width * height * bitsPerPixel / 8.0)

其中 8.0 是 byte 中的位数,ceil 四舍五入到最接近的整数。

对于某些格式,如果无法直接获得该值,您可能需要按如下方式计算 bitsPerPixel

bitsPerPixel = sum(bitsPerSample for each samplePerPixel)

这些不会是 确切 内存需求 BufferedImage,因为它还包含对 RasterColorModel 的一些引用等,但对于大图像,这个常数可以忽略不计。使用上面的公式计算的值应该足以决定是在内存中还是在磁盘上分配图像。