2010-06-22 4 views
0

16 비트 TIFF 이미지 (5 비트 빨강, 6 비트 녹색, 5 비트 파랑)에서 이미지 처리를 수행하는 프로그램을 작성하고 있지만 불행하게도이 코드는 이미지 데이터를 8 비트로 처리합니다 . 코드 정교Java의 tiff에서 16 비트 픽셀 데이터를 어떻게 검색합니까?

, 정말 같은 ImageIO에서 유틸리티 클래스와 메모리에 이미지를 읽어

BufferedImage image = ImageIO.read(imageFile);

나중에 픽셀 정보를 검색 할이 루프 사용에 :

Matrix imageMatrix = new Matrix(image.getHeight(), image.getWidth()); 
Raster raster = image.getData(); 
double[] pixelColor = new double[4]; 
for (int x = 0; x < image.getWidth(); x = x + 1) { 
    for (int y = 0; y < image.getHeight(); y = y + 1) { 
     raster.getPixel(x, y, pixelColor); 
     double pixelColorAverage = (pixelColor[0] + pixelColor[1] + pixelColor[2])/3.0; 
     imageMatrix.set(y, x, pixelColorAverage); 
    } 
} 
return imageMatrix; 

문제는 raster.getPixel(x, y, pixelColor);이 8 비트로 각 RGB 값을 반환한다는 것입니다. (내 테스트 이미지에서 0,0 픽셀 값은 6168,6168,6168 [16 비트 값] 일 때 24,24,24 [8 비트 값]으로 반환됩니다.).

내가 다른 stack overflow tiff question에 따라 코드의 다음 줄에 단순한 ImageIO.read(imageFile)을 변경 시도했다 :

BufferedImage image = ImageIO.read(file); 
BufferedImage convertedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_USHORT_565_RGB); 
convertedImage.createGraphics().drawRenderedImage(image, null); 

그러나이 시간, 중 올바른되지 않습니다 raster.getPixel(x, y, pixelColor); 반환 3,6,3.

ImageIO가 tiff 이미지를 지원하고 버퍼링 된 이미지의 크기가 5-6-5 스타일의 16 비트 이미지 형식을 기반으로한다는 가정하에이 방법을 사용할 수 있다고 가정 할 수는 있지만, 있어야 할 곳에 없는.

+0

??? – Gevorg

답변

2

문제는 그 raster.getPixel (X, Y, pixelColor); 각 RGB 값을 8 비트로 반환합니다 (내 테스트 이미지에서는 6168,6168,6168 [16 비트 값] 일 때 0,0 픽셀 값이 24,24,24 [8 비트 값]으로 반환 됨).

설명이 잘못되었습니다.

픽셀 당 16 비트가 수행되지 않음 이 아님은 빨간색 또는 녹색 또는 파란색 값 당 평균 16 비트입니다. 16 비트는 결합 된 R 및 G와 B 값을 나타냅니다.

따라서 16 비트의 짧은 값은 인 하나의 픽셀로 나눌 수 있습니다.

5 비트는 빨간색 값을 나타냅니다. 6 비트는 녹색 값을 나타냅니다. 5 비트는 파란색 값을 나타냅니다.

Red Green Blue 
----- ------ ----- 
10111 101010 11100 

결합하면 1011110101011100 바이너리 또는 48476 십진수가됩니다.

Java로 코드화 한 적이 없다면 찾고자하는 값을 얻기 위해 다른 함수 호출을 사용해야 할 것으로 생각됩니다. 아마도 [getDataElements] [1]을 시도해 문제의 픽셀에 대한 16 비트 값을 얻을 수 있습니다.

Rememeber, 각 픽셀은 16 비트입니다. 사용자는, 32 비트 (각 화소는 8 비트 플러스 8 비트 알파 값이다.) (각각의 픽셀은 8 비트) 24 비트와 그 혼동

This article from MSDN should help you retreive the RGB values from the 16 bit value.

(또한하여 평균화 코드를 수정해야 할 .)

[1] : http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/Raster.html#getDataElements(int, INT, java.lang.Object 상위) 당신은 TIFF 하나에서`BufferedImage`셨어요 방법

+0

정확합니다. 저는 채널당 5-6-5 비트를 16 비트 대신 채널당 16 비트로 혼동 시켰습니다. 따라서 3,6,3 RGB 값은 해당 컬러 모델에 맞습니다. 결론에 결함을 지적하고 코드를 수정하도록 도와 주셔서 감사합니다. – Peter

관련 문제