내가 가지고있는 것은 많은 수의 프레임을 큰 이미지 (예 : 모자이크)에 배치해야합니다. 이미지의 필수 위치는 알려져 있습니다.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 사양에 읽을 경우
위대한 훌륭한 탐정 작업은 내가보고있는 이상한 행동을 설명합니다. 불행히도 타일로 내 모자이크를 쓸 수 없다는 것을 의미합니다.하지만 도움을 주셔서 감사합니다. – David
오른쪽 가장자리 타일과 아래쪽 가장자리 타일이 맞지 않는 경우 패딩 된 것으로 가정합니다. 즉, 이미지 크기가 타일 크기의 배수가 아닌 것은 문제가 아닙니다. 타일 크기가 128x128 인 645x645 이미지가있는 경우 파일에 인코딩 된 6x6 타일과 일부 공간을 낭비하게되지만 완벽하게 유효합니다. – BitBank