2016-08-09 8 views
3

전체적으로 메모리에로드 할 수없는 두 개의 거대한 이미지가 있습니다. 나는 이미지가 타일 것을 알고 클래스 ImageReader의 모든 방법은Java 고급 이미징 : 거대한 이미지에서 ImageLayout을 얻는 방법?

getTileGridXOffset(int) 나에게 getTileGridYOffset(int), getTileWidth(int)getTileHeight(int)을 그럴듯하게 비 제로 반환 값을 제공합니다.

내 문제는 이제 ImageReader.readtTile(int, int, int) 메서드를 사용하여 전체 이미지를 메모리에로드하지 않아도되도록 하나의 타일 만 읽으려고한다는 것입니다. 그러나 타일 좌표의 유효한 값이 무엇인지 어떻게 결정합니까?

인터페이스 RenderedImage하지만 out of memory/java heap space 오류로 소스 결과로부터 렌더링 된 이미지를 생성하기위한 모든 시도에있어서 getNumXTiles()getNumYTiles()있다.

타일 좌표는 이론적으로는 무엇이든지 될 수 있으며 테스트 한 몇 가지 이미지에서도 작동하는 readtTile(0, -1, -1)을 시도했습니다.

이미지의 메타 데이터에 도달하려고했지만 이미지 레이아웃과 관련하여 유용한 정보를 찾지 못했습니다.

메모리에 전체 이미지를 읽지 않고도 타일 좌표 값을 가져 오는 방법을 알려주는 사람이 있습니까? ImageLayout의 인스턴스를 필요로하지 않는 또 다른 방법이 있습니까?

도움을 주셔서 감사합니다.

답변

0

우선 isImageTiled(imageIndex)을 사용하여 문제의 ImageReader이 주어진 이미지의 타일링을 지원하는지 확인해야합니다. 그렇지 않은 경우 다른 방법의 유용한 값을 기대할 수 없습니다.

그렇다면 주어진 이미지의 모든 타일의 크기는이어야합니다 (단, 각 열의 마지막 타일/마지막 행은 잘릴 수 있음). 내가 아는 바둑판 식 파일 형식 (예 : TIFF)에서도 마찬가지입니다. 그래서,이 지식을 사용하여, 두 차원의 타일의 수를 계산할 수있다

// Calculate number of x tiles/y tiles: 
int cols = (int) Math.ceil(reader.getWidth(imageIndex)/(double) reader.getTileWidth(imageIndex)); 
int rows = (int) Math.ceil(reader.getHeight(imageIndex)/(double) reader.getTileHeight(imageIndex)); 

그런 다음, 타일 인덱스를 통해 루프 (첫 번째 타일은 항상 0,0) 할 수 있습니다

for (int row = 0; row < rows; row++) { 
    for (int col = 0; col < cols; col++) { 
     BufferedImage tile = reader.readTile(imageIndex, col, row); 

     // ...do more processing... 
    } 
} 

또는 하나의 타일 만 얻으려는 경우에는 이중 루프 for이 필요하지 않습니다. :-)


참고 : ImageReader S/타일링을 지원하지 않는 이미지의 경우, getTileWidthgetTileHeight 방법은 각각 getWidthgetHeight 같은를 반환합니다.

또한, readTile API 문서는 말한다 : 인수가 영역 외에있는 경우

, IllegalArgumentException가 발생합니다. 이미지가 타일링되지 않으면 값 0, 0이 전체 이미지를 반환합니다. 다른 값을 지정하면 IllegalArgumentException이 발생합니다.

이것은 당신의 예를 의미 readtTile(0, -1, -1) 항상 IllegalArgumentException에 관계없이 타일의 ... 나는 일부 구현은 타일이 완전히 좌표를 무시 의심 던지, 어쨌든 당신에게 전체 이미지를 제공해야합니다.


PS : 이론 도움이 당신의 RenderedImage 인터페이스 . 그러나 ImageReader에는 특별한 구현이 필요합니다. 대부분의 경우 보통 BufferedImage (RenderedImage)을 구현하며 단일 (1x1) 타일입니다.