t6n*_*and 3 java caching bufferedimage image-processing javax.imageio
我对使用 BufferedImage 对象的唯一担心是,对于非常大的图像(例如 60000x32000),它将导致 JVM 在有限的 JVM 堆空间上因 OOM 而关闭。然而,ImageIO.read方法的JavaDocs说了一些关于“控制缓存”的内容。
在这种情况下,什么是控制缓存?
这是否意味着 ImageIO.read 使用磁盘上的图像缓存来处理大图像?
参考下面的JavaDocs和ImageIO.read方法:
/**
* Returns a <code>BufferedImage</code> as the result of decoding
* a supplied <code>File</code> with an <code>ImageReader</code>
* chosen automatically from among those currently registered.
* The <code>File</code> is wrapped in an
* <code>ImageInputStream</code>. If no registered
* <code>ImageReader</code> claims to be able to read the
* resulting stream, <code>null</code> is returned.
*
* <p> The current cache settings from <code>getUseCache</code>and
* <code>getCacheDirectory</code> will be used to control caching in the
* <code>ImageInputStream</code> that is created.
*
* <p> Note that there is no <code>read</code> method that takes a
* filename as a <code>String</code>; use this method instead after
* creating a <code>File</code> from the filename.
*
* <p> This method does not attempt to locate
* <code>ImageReader</code>s that can read directly from a
* <code>File</code>; that may be accomplished using
* <code>IIORegistry</code> and <code>ImageReaderSpi</code>.
*
* @param input a <code>File</code> to read from.
*
* @return a <code>BufferedImage</code> containing the decoded
* contents of the input, or <code>null</code>.
*
* @exception IllegalArgumentException if <code>input</code> is
* <code>null</code>.
* @exception IOException if an error occurs during reading.
*/
public static BufferedImage read(File input) throws IOException {
if (input == null) {
throw new IllegalArgumentException("input == null!");
}
if (!input.canRead()) {
throw new IIOException("Can't read input file!");
}
ImageInputStream stream = createImageInputStream(input);
if (stream == null) {
throw new IIOException("Can't create an ImageInputStream!");
}
BufferedImage bi = read(stream);
if (bi == null) {
stream.close();
}
return bi;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它仅意味着该方法将使用和 的read设置来控制是否允许缓存 ( ),如果允许,则可以在何处存储临时文件 ( )。getUseCachegetCacheDirectorygetUseCachegetCacheDirectory
ImageIO 中的缓存并不引人注目,可能仅用于处理不可查找的流。例如,当 ImageIO 需要确定图像的大小时,它可能需要读取流的很大一部分。然后,它可能需要再次重新读取流的该部分以进行实际的解码。
对于支持查找的文件和流,这不是问题,因为您可以在开始解码时重新读取前面的部分。对于 HTTP 流来说,没有这样的选项,在这种情况下,部分流可能需要存储在某处以便稍后解码。它可以位于内存 ( MemoryCacheImageInputStream) 或临时文件 ( FileCacheImageInputStream) 中。
使用哪种类型的流由类决定,ImageIO该类根据缓存设置和底层媒体动态决定。
所以,我认为这在处理非常大的图像时不会有帮助。您仍然需要确保虚拟机有足够的空间来解码它们。
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |