从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 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://sofzh.miximages.com/java/image.jpg“)); BufferedImage region = image.getSubimage(regionX, regionY, regionWidth, regionHeight);

然后您可以根据需要处理区域子图像。