是否有一个Java 库可以读取非常大的图像(例如JPEG)文件(> 10,000 x 10,000 像素)的区域,而无需将整个图像保存在内存中。
或者,哪个 Java 库能够以最少的开销处理非常大的图像文件。
是否有一个Java 库可以读取非常大的图像(例如JPEG)文件(> 10,000 x 10,000 像素)的区域,而无需将整个图像保存在内存中。
或者,哪个 Java 库能够以最少的开销处理非常大的图像文件。
标准 ImageIO 允许您读取(大)图像的区域,而无需先将整个图像读入内存。
Rectangle sourceRegion = new Rectangle(x, y, w, h); // The region you want to extract
ImageInputStream stream = ImageIO.createImageInputStream(input); // File or input stream
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (readers.hasNext()) {
ImageReader reader = readers.next();
reader.setInput(stream);
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceRegion(sourceRegion); // Set region
BufferedImage image = reader.read(0, param); // Will read only the region specified
}
例如,您可以使用 RandomAccessFile 从文件中间读取:但问题是整个 jpeg 图像在 DCT 量化后被压缩(http://www.fileformat.info/mirror/egff/ch09_06.htm),所以我认为在不将整个文件读取到内存的情况下读取片段是不可能的。
您可以使用 aBufferedImage
来做您需要的事情。
// Set these variables according to your requirements
int regionX, regionY, regionWidth, regionHeight;
BufferedImage image = ImageIO.read(new File("/path/to/image.jpg"));
BufferedImage region = image.getSubimage(regionX, regionY, regionWidth, regionHeight);
然后您可以根据需要处理区域子图像。