java rgb565转rgb888_RGB565 转RGB888的循环补偿(zz)

在进行色彩格式转换的时候,经常会遇到色彩量化位数的改变,比如说从

24bit RGB888 到 16bit RGB565

的色彩转换。所谓量化压缩与量化补偿都是我个人所提出的概念,现说明如下。

量化压缩,举例:

24bit RGB888 -> 16bit RGB565 的转换

24ibt RGB888 R7 R6 R5 R4 R3 R2 R1

R0 G7 G6 G5 G4 G3 G2 G1

G0 B7 B6 B5 B4 B3 B2 B1

B0

16bit

RGB656 R7

R6 R5 R4

R3 G7 G6 G5 G4 G3

G2 B7

B6 B5 B4 B3

量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了压缩,却损失了精度。

量化补偿,举例:

16bit RGB565 -> 24bit RGB888 的转换

16bit

RGB656 R4

R3 R2 R1

R0 G5 G4 G3 G2 G1

G0 B4

B3 B2 B1 B0

24ibt RGB888 R4 R3 R2 R1

R0 0 0 0 G5 G4 G3 G2 G1

G0 0 0 B4 B3 B2 B1

B0 0 0 0

24ibt RGB888 R4 R3 R2 R1 R0 R2 R1

R0 G5 G4 G3 G2 G1 G0 G1

G0 B4 B3 B2 B1 B0 B2 B1

B0

说明:第二行的 24bit RGB888 数据为转换后,未进行补偿的数据,在精度上会有损失;第三行的 24bit RGB888

数据为经过量化补偿的数据,对低位做了量化补偿可以很容易的证明,这样的补偿方法是一种合理的线性补偿。补偿的原理很简单,大家仔细想一下就明白了,因此不再详细说明。

总结一下:

量化压缩的方法:三个字取高位

量化补偿的方法:

1.

将原数据填充至高位

2.

对于低位,用原始数据的低位进行补偿

3.

如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿

解释一下循环补偿的概念:

8bit RGB332 -> 24bit RGB888 的转换

8bit RGB332 R2

R1

R0 G2

G1

G0 B1

B0

24bit RGB888 R2 R1

R0 0 0 0 0 0 G2 G1

G0 0 0 0 0 0 B1

B0 0 0 0 0 0 0

24bit RGB888 R2 R1 R0 R2 R1

R0 0 0 G2 G1 G0 G2 G1

G0 0 0 B1

B0 B1

B0 0 0 0 0

24bit RGB888 R2 R1 R0 R2 R1 R0 R2

R1 G2 G1 G0 G2 G1 G0 G2

G1 B1 B0 B1 B0 B1

B0 0 0

24bit RGB888 R2 R1 R0 R2 R1 R0 R2

R1 G2 G1 G0 G2 G1 G0 G2

G1 B1 B0 B1 B0 B1 B0 B1

B0

看了这个,应该明白则么回事了吧,其中B分量,进行了四轮的补偿,达到要求。

举个更加易懂的例子,比如2bit->4bit的转换:

2b  4b

4b(循环)

00  0000 (0)  0000

(0)

01  0100(4)  0101 (5)

10  1000(8)  1010 (12)

11  1100(12)  1111

(15)

首先4bit能够表示的范围为0-15,第一种方法中无法表达这个范围(最大为12),而循环补位可以填充到整个4bit的最大最小的空间。

当然还可以设计其它的方式来进行这种mapping,不一定就是这种补位的方法:比如下面就给出了这个公式:

仍然以2bit->4bit为例子:

15/3 * x2 = x4

x2  x4

0  0

1  5

2  10

3  15

当然循环补位是比较容易硬件实现的,因此在已经成为了一种事实上的标准做法。

You want to map each of these from a 5/6 bit space to an 8 bit

space.

5 bits = 32 values

6 bits = 64 values

8

bits = 256 values

The code you're using is taking the naive approach that x5 * 256/32

= x8 where 256/32 = 8 and multiplying by 8 is left shift 3 but, as

you say, this doesn't necessarily fill the new number space

"correctly". 5 to 8 for max value is 31 to 255 and therein lies

your clue to the solution.

x8 = 255/31 * x5

x8 = 255/63 * x6

where x5, x6 and x8 are

5, 6 and 8 bit values respectively.

Now there is a question about the best way to implement this. It

does involve division and with integer division you will lose any

remainder result (round down basically) so the best solution is

probably to do floating point arithmetic and then round half up

back to an integer.

量化补偿的必要性,从直觉上讲,我所提出的这种补偿方法是正确的(因为我并没有严格的去证明),进行这样的补偿,在做色彩各式转换的时候,能够明显的改善色彩效果,减少精度上的损失。

对256色调色板模式的认识和应用,顺便讲一下这个,因为量化压缩和量化补偿刚好可以应用到调色板模式下。大家都知道,很早以前就有人提过出256色的标准调色板的概念(有的人又称之为抖动调色板或者万能调色板),其实这样的调色板并不神秘。256色中,一个像素点用8bit表示,那么如果采用

8bit RGB332 的格式,一切问题都可以想通,并且可以进行很好的处理了。对于每个 RGB332

的颜色,都可以使用量化补偿的做法,将其转换为 24bit RGB888

的颜色格式,然后将其设置为调色板即可。这样,实质上是将256色调色板模式,转换为了 8bit RGB332

的像素格式。这样的调色板方式,更加利于某些方面的处理,比如调色板匹配、Alpha混合等。由于采用了这样的方法,一个像素点的颜色值,与其实际的RGB颜色值,可以很方便的通过量化补偿的方法转换出来,然后就可以对各个颜色分量进行计算,计算完毕,再使用量化压缩的方法,就可以生成最终需要的颜色值。而所谓的调色板匹配的问题,当然也更加好解决了。关键是要把问题想通,把握事物的本质,才能找到简单而优美的解决问题的方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值