2013-08-27 2 views
5

전체 이미지를 메모리에 보관하지 않고 매우 큰 이미지 (예 : JPEG) 파일 (> 10,000 x 10,000 픽셀)의 영역을 읽을 수있는 Java 라이브러리가 있습니까?Java의 매우 큰 이미지 파일에서 영역 읽기

또는 Java 라이브러리는 최소한의 오버 헤드로 매우 큰 이미지 파일을 처리 할 수 ​​있습니다.

+0

전체 이미지에서 바이트 오프셋 및 길이 또는 몇 픽셀의 측면에서 영역을 읽으 려하십니까? –

+0

픽셀 단위의 영역. – f3lix

+0

좋아, 아래에 게시 한 답변을 사용해보십시오. –

답변

7

표준 이미지 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 
} 
+0

이것은 멋지게 작동하는 것 같습니다. 감사. – f3lix

+0

안녕하세요! 아주 좋은 코드가 잘려서 고마워. 전체 이미지를 읽지 않고 이미지에 영역을 쓸 수 있습니까? 내 지역은 100px 크기로 거대한 Jpeg의 특정 위치에 저장하고 싶습니다. – Durin

+0

@Durin 예, 특정 파일 형식에서 가능할 수 있습니다. ImageIO API는이를 지원합니다. 그러나 새로운 질문을하십시오! :-) – haraldK

0

당신은 예를 들어, 사용할 수있는, RandomAccessFile의 파일의 중간에서 읽기 : 하지만 문제는 전체 jpeg 이미지가 DCT 양자화 (http://www.fileformat.info/mirror/egff/ch09_06.htm) 후 압축된다, 그래서 나는 가능하다 생각하지 않습니다 전체 파일을 메모리로 읽지 않고 조각을 읽습니다.

+1

JPEG와 DCT 양자화에 대한 표면적 지식 만 있지만 DCT가 8x8 픽셀 블록에 적용되며 모든 블록을 디코딩하지 않아도 영역을 확보 할 수 있어야한다고 생각합니다. 물론 이미지의 다른 부분에서 일부 계수/정보를 가져올 필요가 있지만, 이것이 모든 데이터를 메모리로 읽어야한다는 것을 의미하지는 않습니다. 그러나 틀릴 수 있습니다. – f3lix

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

그리고 원하는대로 영역 하위 이미지를 처리 ​​할 수 ​​있습니다.

+0

...하지만 그것은 모든 것을 메모리 1로 읽을 것입니까? – radai

+1

@Raman : 보통 크기의 이미지로 잘 작동하는 표준 방식을 설명합니다. * 전체 * 이미지를 BufferedImage로 읽은 다음 영역을 추출합니다. 내 문제는 모든 픽셀이 디코딩되고 메모리에 보관되므로 매우 큰 이미지가있는 많은 메모리가 필요하다는 것입니다. 크기가 20,000x30,000 인 이미지의 경우 거의 2GB의 메모리가 필요합니다. 더하기, 디코더는 결코 사용되지 않는 디코딩 픽셀에 시간을 소비합니다 ... – f3lix