从Java中的非常大的图像文件中读取区域

时间:2013-08-27 13:14:12

标签: java image-processing jai

是否有一个Java库可以读取超大图像(例如JPEG)文件的区域(> 10,000 x 10,000像素),而不会将整个图像保留在内存中。

或者,哪个Java库能够以最小的开销处理非常大的图像文件。

3 个答案:

答案 0 :(得分:8)

标准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
}

答案 1 :(得分:0)

您可以使用例如RandomAccessFile从文件中间读取: 但问题是整个jpeg图像在DCT量化后被压缩(http://www.fileformat.info/mirror/egff/ch09_06.htm),所以我认为没有将整个文件读取到内存中就可以读取片段。

答案 2 :(得分:0)

您可以使用BufferedImage来执行您需要的操作。

// 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);

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