2016-08-24 55 views
0

Java 고급 이미징 (JAI)을 사용하여 BufferedImage에서 TIFF를 작성하려고하는데 투명하게 만드는 방법이 확실하지 않습니다. 다음 방법은 PNG 파일과 GIF를 투명하게 작동 :JAI를 사용하여 Java에서 투명하게 TIFF를 만드는 방법은 무엇입니까?

private static BufferedImage makeTransparent(BufferedImage image, int x, int y) { 
    ColorModel cm = image.getColorModel(); 
    if (!(cm instanceof IndexColorModel)) { 
     return image; 
    } 
    IndexColorModel icm = (IndexColorModel) cm; 
    WritableRaster raster = image.getRaster(); 
    int pixel = raster.getSample(x, y, 0); 
    // pixel is offset in ICM's palette 
    int size = icm.getMapSize(); 
    byte[] reds = new byte[size]; 
    byte[] greens = new byte[size]; 
    byte[] blues = new byte[size]; 
    icm.getReds(reds); 
    icm.getGreens(greens); 
    icm.getBlues(blues); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); 
    return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); 
} 

을하지만 TIFF를 작성할 때, 배경은 항상 흰색입니다. 실제로 GeoTIFF 다루고있어 나는이 나중에 어떤 메타 데이터 조작을 할

BufferedImage destination = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); 
Graphics imageGraphics = destination.getGraphics(); 
imageGraphics.drawImage(sourceImage, 0, 0, backgroundColor, null); 
if (isTransparent) { 
    destination = makeTransparent(destination, 0, 0); 
} 
destination.createGraphics().drawImage(sourceImage, 0, 0, null); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageOutputStream ios = ImageIO.createImageOutputStream(baos); 
TIFFImageWriter writer = new TIFFImageWriter(new TIFFImageWriterSpi()); 
writer.setOutput(ios); 
writer.write(destination); 

: 아래 작성 TIFF에 사용되는 내 코드입니다. 그러나 여전히 이미지는이 시점에서 흰색입니다. 디버깅하는 동안 나는 BufferedImage을 볼 수 있으며 투명합니다. 그러나 이미지를 쓸 때 파일의 배경은 흰색입니다. TiffImageWriteParam과 관련된 특정 작업을 수행해야합니까? 제공 할 수있는 도움에 감사드립니다.

+0

나는 지금까지 한 연구에서 그들이하는 것처럼 보입니다. 나는 또한 투명한 tif의 예를 가지고있다. – Justin

+0

흠 .. 왜 목적지에 소스를 두 번 그리는가? (길을 따라 두 개의'Graphics' 컨텍스트를 만드는 이유는 무엇입니까?) – haraldK

답변

0

TIFF에는 투명도 정보 (알파 채널)를 팔레트에 저장하는 옵션이 없습니다 (IndexedColorModel에서와 같이). 팔레트는 RGB 삼중 항만 지원합니다. 따라서 이미지를 TIFF에 쓸 때 투명하게 색 ​​인덱스를 설정한다는 사실은 손실됩니다.

당신이 투명 TIFF이 필요한 경우, 옵션은 다음과 같습니다

  • 를 사용하여 일반 RGBA 대신 인덱스 색상 (RGB, 4 개 샘플/픽셀, 연결되지 않은 알파). BufferedImage.TYPE_INT_ARGB 또는 TYPE_4BYTE_ABGR을 사용하십시오. 이렇게하면 출력 파일이 커지지 만 구현하기 쉽고 호환성이 높아집니다. 거의 모든 TIFF 소프트웨어에서 지원됩니다.
  • 팔레트 이미지로 별도의 투명 마스크 (측광 해석이 4로 설정된 1 비트 이미지)를 저장하십시오. 많은 소프트웨어가 지원하는지 확실하지 않은 경우도 있으며, 일부는 마스크를 별도의 흑백 이미지로 표시 할 수도 있습니다. JAI/ImageIO에서이 작업을 수행하는 방법을 잘 모르면 시퀀스 작성 및 추가 메타 데이터 설정이 필요할 수 있습니다.
  • 투명한 색인을 포함하는 사용자 정의 필드를 저장하십시오. 자신의 소프트웨어 이외에는 지원되지 않지만 파일은 여전히 ​​호환 가능하며 다른 소프트웨어의 흰색 (단색) 배경과 함께 표시됩니다. TIFF 메타 데이터를 사용하여이를 설정할 수 있어야합니다.