2014-02-13 2 views
1

나는 TIFF에 256 바이트 색상 표가 있습니다. 자바에서 나는 TIFF에서 BufferedImage까지 읽었다. 이 BufferedImageIndexColorModel입니다. BufferedImage의 픽셀을 반복 할 때 RGB 만 얻을 수 있습니다. BufferedImage (RGB 색이 아닌, TIFF 팔레트로부터의 오리지날 인덱스)를 사용해, x,y가 팔레트로부터 원색의 인덱스를 얻는 방법을 쓰고 싶습니다. 어떻게하면 될까요?팔레트를 사용하여 TIFF에서 픽셀 색상 색인을 얻는 중

IndexColorModel을 반복하고 RBG 동등성을 확인할 수 있지만 TIFF에 동일한 색 (예 : 인덱스 0 - 검정색, 132 - 검정색)이 적어도 2 개의 인덱스가있는 경우 작동하지 않습니다. 그 픽셀 10x10 검정색이 [rgb=0,0,0] 인 경우 - 어떤 색인을 사용해야하는지 모릅니다 - RGB 값이 동일합니다. 또한 raw TIFF을 읽고 바이트 배열의 픽셀 위치를 계산할 수도 있지만이 작업을 원하지는 않습니다. JAI에서 뭔가를 사용하고 싶습니다.

BufferedImageJAI으로 외부 라이브러리가없는 방법이 있습니까?

감사

+0

당신이 함께 예를 들어 이미지를 제공 할 수 있습니다 (만 검증으로) "표준"BufferedImage에 결과를 기록 적절한 형식? – Marco13

+0

예제 파일을 http://www.filedropper.com/exampletiff256 링크에서 사용할 수 있도록 만들었습니다. (간단한 파일 업로드 서비스를 찾았으므로이 링크가 활성화되지 않으면 죄송합니다 :)) –

답변

3

OK, 당신이 DataBuffer를

에서 래스터에서의 BufferedImage

  • 해, DataBuffer에서
  • 데이터 배열을

    • 래스터를 얻을 수 있으며, 이 데이터 배열로부터 실제로 사용되는 인덱스를 취득합니다.

      이 예에서는 색상 모델에서 해당 색상을 검색, 인덱스를 읽고,

      import java.awt.image.BufferedImage; 
      import java.awt.image.ColorModel; 
      import java.awt.image.DataBuffer; 
      import java.awt.image.DataBufferByte; 
      import java.awt.image.IndexColorModel; 
      import java.io.File; 
      import java.io.IOException; 
      
      import javax.imageio.ImageIO; 
      
      public class IndexedBufferedImage 
      { 
          public static void main(String[] args) throws IOException 
          { 
           BufferedImage image = ImageIO.read(new File("exampleTiff256.tif")); 
           System.out.println(image); 
           System.out.println(image.getColorModel()); 
      
           ColorModel colorModel = image.getColorModel(); 
           IndexColorModel indexColorModel = null; 
           if (colorModel instanceof IndexColorModel) 
           { 
            indexColorModel = (IndexColorModel)colorModel; 
           } 
           else 
           { 
            System.out.println("No IndexColorModel"); 
            return; 
           } 
      
           DataBuffer dataBuffer = image.getRaster().getDataBuffer(); 
           DataBufferByte dataBufferByte = null; 
           if (dataBuffer instanceof DataBufferByte) 
           { 
            dataBufferByte = (DataBufferByte)dataBuffer; 
           } 
           else 
           { 
            System.out.println("No DataBufferByte"); 
            return; 
           } 
      
           int w = image.getWidth(); 
           int h = image.getHeight(); 
           BufferedImage test = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
           byte data[] = dataBufferByte.getData(); 
           for (int y=0; y<h; y++) 
           { 
            for (int x=0; x<w; x++) 
            { 
             int arrayIndex = x + y * w; 
             int colorIndex = data[arrayIndex]; 
             int color = indexColorModel.getRGB(colorIndex); 
             System.out.println("At "+x+" "+y+" index is "+colorIndex+ 
              " with color "+Integer.toHexString(color)); 
             test.setRGB(x, y, color); 
            } 
           } 
           ImageIO.write(test, "PNG", new File("exampleTiff256.png")); 
          } 
      } 
      
  • +0

    감사합니다. 난 당신이 여기에 intersted 경우 similary 작동 무언가를 찾았습니다 링크 : http://stackoverflow.com/questions/6524196/java-get-pixel-array-from-image 다시 한번 감사드립니다! –