2011-08-01 3 views
3

내가 가지고있는 것은 많은 수의 프레임을 큰 이미지 (예 : 모자이크)에 배치해야합니다. 이미지의 필수 위치는 알려져 있습니다.Java에서 ImageIO를 사용하여 TIFF의 바둑판 식 출력을 작성하십시오.

매우 많은 수의 이미지가 있으므로 메모리에 모두로드하면 기껏해야 실용적이지 않습니다.

다른 답변을 바탕으로 RenderedImage (특히 getData(rect))의 메소드를 오버라이드하여 적절한 데이터를로드하고 반환 할 수있었습니다.

이것은 잘 작동하지만 이미지 라이터는 항상 getData을 호출하고 데이터 행을 요청합니다. 그것은 나에게 개별 타일을 대신 호출하도록 ImageWriterParam을 변경할 수 있어야한다고 생각하지만, 쓰기 함수를 시도했을 때 getData에서 한 줄을 호출합니다.

어떻게 강제로 타일을 사용하고 getTile을 호출 할 수 있습니까? 이를 사용하지만 때 내가 param.setTilingMode(ImageWriteParam.MODE_EXPLICIT);

setTiling(w,h,xoff,yoff);을 사용할 수 있습니다

BufferedOutputStream bos=null; 
try { 
    bos = new BufferedOutputStream(new FileOutputStream(new File("test2.tiff"))); 

    ImageWriter writer =(ImageWriter) ImageIO.getImageWritersBySuffix("tif").next(); 

    ImageOutputStream ios=null 

    ios = ImageIO.createImageOutputStream(bos); 

    writer.setOutput(ios); 
    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setTilingMode(ImageWriteParam.MODE_DEFAULT); 

    RenderedImage mosaic = new MosaicImage(imageFiles[]); 

    writer.write(null,new IIOImage(mosaic,null,null),param); 

    } catch (FileNotFoundException ex) { 

    } 

참고 writer.write는 여전히 w,h에 의해 지정된 크기의 구형 호출하지 않습니다 매우 짜증나 내 이미지에 getData(rect)를 호출합니다. 내가 setTiling(100,100,0,0);

하나가 기대 사용하는 경우 예를 들어

(아마도 뭔가에서 유래) 어떤 임의의 양만큼 다른 크기의 사각형을 호출이 이미지에서으로 getTile를 호출하지 않는 경우에도 그는 getData에 건네진 Rectangle는 (0,0,100,100)이 아니면, 이미지의 폭의 배수가 아닌 Rectangle (0,0,96,96)을 건네줍니다. 도움 당신은 TileWidth 및 TileLength 필드에서 TIFF 6.0 사양에 읽을 경우

답변

3

에 대한

감사합니다, 당신은 TileWidth이 있어야합니다

가 16의 배수가 이러한 제한이 향상 텍스트

를 찾을 수 일부 그래픽 환경에서는 성능을 향상시키고 JPEG와 같은 압축 체계를 사용하면 호환성을 향상시킵니다.

및 TileLength와 유사합니다. 100x100은 16으로 나눌 수 없지만 96x96입니다. TIFF 인코더가 요청을 완벽하게 채우려 고합니다.

+0

위대한 훌륭한 탐정 작업은 내가보고있는 이상한 행동을 설명합니다. 불행히도 타일로 내 모자이크를 쓸 수 없다는 것을 의미합니다.하지만 도움을 주셔서 감사합니다. – David

+0

오른쪽 가장자리 타일과 아래쪽 가장자리 타일이 맞지 않는 경우 패딩 된 것으로 가정합니다. 즉, 이미지 크기가 타일 크기의 배수가 아닌 것은 문제가 아닙니다. 타일 ​​크기가 128x128 인 645x645 이미지가있는 경우 파일에 인코딩 된 6x6 타일과 일부 공간을 낭비하게되지만 완벽하게 유효합니다. – BitBank

관련 문제