我目前正在开发一个 Web 服务,该服务必须将 PDF 转换为图像、缩小这些图像的比例并将每个比例拆分为不同的图 block 。
对于我们的大多数用户数据来说,图像尺寸都不太大,整个过程适合内存。
但尤其是在将大型矢量化 PDF 转换为图像时,导致分辨率达到 50k+ 乘以 50k 分辨率,一个 BufferedImage
实例的内存很容易达到 8GB 或更多。
由于它是一个网络服务器,我想并行处理尽可能多的请求(甚至同时进行缩放和平铺操作) - 我需要一些内存控制条款。
我知道我可能需要在步骤之间将更大的图像存储到磁盘上。实际上有一些有用的 BufferedImage 开源版本,它们可以使用内存和磁盘(请参阅 BigBufferedImage)...但是存在性能权衡,特别是对于较小的图像。
90% 的时间我可以毫无问题地在内存中完成所有操作。所以我想问:如何提前计算出BufferedImage在内存中的大小?我查看了 Javadoc,并在 Google 上搜索了一些关于 quit 的信息。我并不是图像文件格式、颜色模型等方面的真正专家。并且不知道从哪里开始。任何人都可以指出我需要了解的进行这些计算的事情,其可能的准确性以及我还需要考虑什么?
最佳答案
通常,图像的像素所需的内存可以通过如下方式计算(伪代码):
memoryNeeded = ceil(width * height * bitsPerPixel / 8.0)
其中 8.0 是一个字节
中的位数,ceil
向上舍入到最接近的整数。
对于某些格式,如果该值无法直接获得,您可能必须按如下方式计算bitsPerPixel
:
bitsPerPixel = sum(bitsPerSample for each samplePerPixel)
这些并不是 BufferedImage
的准确内存要求,因为它还包含一些对 Raster
、ColorModel 的引用
等,但对于大图像,这个常数可以忽略不计。使用上面的公式计算出的值应该足以决定是否在内存或磁盘上分配图像。
关于Java缓冲图像: Calculate Memory Size in Advance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41260057/