2009-07-24 3 views
2

Java 라이브러리를 사용하여 32bpp 이미지 (ARGB)를 16bpp 이미지 (ARGB)로 변환 할 수 있습니까? 내 호기심에, 픽셀 수준에서,이 변환은 무엇을합니까? 모든 채널에서 픽셀의 값을 보유하는 int 값이있는 경우 변환이 발생한 후 해당 int는 어떻게 다릅니 까?Java에서 32bpp 이미지를 16bpp 이미지로 변환

답변

3

16 비트 ARGB 값으로 변환 된 32 비트 AARRGGBB 값은 다음과 같이 될 것이다 :

int argb = ((aarrggbb & 0x000000F0) >> 4) 
     | ((aarrggbb & 0x0000F000) >> 8) 
     | ((aarrggbb & 0x00F00000) >> 12) 
     | ((aarrggbb & 0xF0000000) >> 16); 

그것은 하위 16 비트 모두 스틱 0.

로 상위 16 비트 잎

각 채널에 대해 색상 정보의 하위 4 비트가 손실되며 상위 정보는 다소 중요합니다. 색상은 가장 가까운 4 비트 값으로 양자화되어 시각적으로 불쾌한 색상 밴딩 효과를 가져옵니다.

덧붙여서, 16 ​​비트 컬러는 일반적으로 알파 성분을 포함하지 않습니다. 일반적으로 (항상은 아니지만) 적색은 5 비트, 녹색은 6 비트 (녹색/청색에 가장 민감하므로)와 파란색으로 5 비트로 구분됩니다.

이 변환은 4 대신 각 채널에서 2 또는 3 비트의 정보 만 잃어 버리고 소스 픽셀에 알파가 포함되지 않았다고 가정합니다.

+0

자세한 설명 주셔서 감사합니다! – Geo

-1

이미지를 읽고 필요한 형식으로 저장하십시오. http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html

// Create an image to save 
RenderedImage rendImage = myCreateImage(); 

// Write generated image to a file 
try { 
    // Save as PNG 
    File file = new File("newimage.png"); 
    ImageIO.write(rendImage, "png", file); 

    // Save as JPEG 
    file = new File("newimage.jpg"); 
    ImageIO.write(rendImage, "jpg", file); 
} catch (IOException e) { 
} 

에서 javax.imageio.ImageIO.getWriterFormatNames의 출력() 당신이 필요로하는 형식을 찾을 수를 참조하십시오.

16bpp를 사용할 때 각 픽셀의 내부 표현은 변경되지 않지만 (표현 손실은 제외) 디스크에 저장된 바이트는 변경됩니다.

+0

어떻게 png 또는 jpeg로 이미지를 저장하면 도움이됩니까? – Geo

+0

이미지 파일에 대해 16bpp 정도만 이야기하면됩니다. Java는 메모리에 비 압축 이미지를 사용합니다. 대답이 이해가되지 않는 경우 질문의 단어를 바꿀 수 있습니다. –