전체 이미지를 메모리에 보관하지 않고 매우 큰 이미지 (예 : JPEG) 파일 (> 10,000 x 10,000 픽셀)의 영역을 읽을 수있는 Java 라이브러리가 있습니까?Java의 매우 큰 이미지 파일에서 영역 읽기
또는 Java 라이브러리는 최소한의 오버 헤드로 매우 큰 이미지 파일을 처리 할 수 있습니다.
전체 이미지를 메모리에 보관하지 않고 매우 큰 이미지 (예 : JPEG) 파일 (> 10,000 x 10,000 픽셀)의 영역을 읽을 수있는 Java 라이브러리가 있습니까?Java의 매우 큰 이미지 파일에서 영역 읽기
또는 Java 라이브러리는 최소한의 오버 헤드로 매우 큰 이미지 파일을 처리 할 수 있습니다.
표준 이미지 IO를 사용하면 전체 이미지를 메모리에 먼저 읽지 않고 (큰) 이미지의 영역을 읽을 수 있습니다.
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) 후 압축된다, 그래서 나는 가능하다 생각하지 않습니다 전체 파일을 메모리로 읽지 않고 조각을 읽습니다.
JPEG와 DCT 양자화에 대한 표면적 지식 만 있지만 DCT가 8x8 픽셀 블록에 적용되며 모든 블록을 디코딩하지 않아도 영역을 확보 할 수 있어야한다고 생각합니다. 물론 이미지의 다른 부분에서 일부 계수/정보를 가져올 필요가 있지만, 이것이 모든 데이터를 메모리로 읽어야한다는 것을 의미하지는 않습니다. 그러나 틀릴 수 있습니다. – f3lix
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);
그리고 원하는대로 영역 하위 이미지를 처리 할 수 있습니다.
전체 이미지에서 바이트 오프셋 및 길이 또는 몇 픽셀의 측면에서 영역을 읽으 려하십니까? –
픽셀 단위의 영역. – f3lix
좋아, 아래에 게시 한 답변을 사용해보십시오. –