2012-07-18 194 views
1

我能够与BufferedImage以获得一个640x640的图像的每个像素的RGB值,输出看起来是这样的:转换24位图像RGB到3位8色

[...] 
Pixel :(640, 634) RGB: 166 94 82 
Pixel :(640, 635) RGB: 166 94 80 
Pixel :(640, 636) RGB: 163 91 77 
Pixel :(640, 637) RGB: 157 88 73 
Pixel :(640, 638) RGB: 157 88 73 
Pixel :(640, 639) RGB: 159 90 74 
Pixel :(640, 640) RGB: 158 89 73 
This image has 69197 colors. 

我需要将这种方式获得的每种RGB颜色分类为3位RGB(8种颜色),我需要对如何做到这一点有一个想法...如何知道RGB的8个颜色中的每一个的范围3位RGB。谢谢!

+0

该操作称​​为[抖动](http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing)。 – 2012-07-18 18:41:36

回答

3

您的结果图像将有1位为每个颜色组件。

为红色,例如,你应该这样做:

red1Bit = redOriginal > 127 ? 1 : 0; 

你应该为蓝色和绿色做同样也是如此。

+0

wooow !!这是合乎逻辑的 – 2012-07-18 18:38:05

1

24位RGB调色板使用每个红色,绿色和蓝色分量的8位:

RGB([0..255], [0..255], [0..255])

一个3比特的RGB调色板使用每个红,绿和蓝颜色分量的1位:

RGB([0..1], [0..1], [0..1])

由于每个通道的范围只有两个值,因此需要将8位编码减少为1位编码。在八位编码为此,除以所述最大值的一半(255/2 = 127

可以使用整数除法对于每个RGB compenent的转化:

3 bit R : (8-bit Red Value)/127 
     G : (8-bit Green Value)/127 
     B : (8-bit Blue Value)/127 

实施例:

3 bit R : (56)/127 = 0 
     G : (225)/127 = 1 
     B : (127)/127 = 1