Читать регион из очень большого файла изображения в Java

Существует ли библиотека Java, которая может считывать области файлов очень больших изображений (например, JPEG) (> 10 000 x 10 000 пикселей), не сохраняя все изображение в памяти.

Или же, какая библиотека Java способна обрабатывать очень большие файлы изображений с минимальными издержками.

3 ответа

Решение

Стандартный 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
}

Вы можете использовать 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);

И тогда вы можете обработать изображение области, как вы хотите.

Вы можете использовать, например, RandomAccessFile для чтения из середины файла: но проблема в том, что все изображение JPEG сжимается после квантования DCT ( http://www.fileformat.info/mirror/egff/ch09_06.htm), поэтому я не думаю, что можно прочитать фрагмент без чтения всего файла в память.

Другие вопросы по тегам