将RGB存储在无符号16位整数中

时间:2013-09-25 15:14:02

标签: c++ bit-shift

我将3值RGB表示存储到16位整数中,通过根据此处的答案进行位移(Convert RGB values to Integer)。它似乎适用于gb值,但r始终返回为0.

我的代码是:

uint16_t rgb = ((r&0x0ff) << 16) | ((g&0x0ff) << 8) | (b&0x0ff);
        qDebug() << "wrote rgb: " << rgb;
        qDebug() << "wrote r: " << r << " g: " << g << " b: " << b;
        qDebug() << "unshifted r: " << ((rgb >> 16) & 0x0ff) << " g: " << ((rgb >> 8) & 0x0ff) << " b: " << (rgb & 0x0ff);

2 个答案:

答案 0 :(得分:5)

你正在使用16位int,并将红色值移动16位,所以你实际上只是在做r = 0。您实际上是将值移到可用空间的末尾。要存储三个8位值,您需要至少24位,这意味着您将不得不使用uint32_t。

答案 1 :(得分:5)

如果需要以16位整数存储RGB,则只能存储分辨率有限的颜色。通常,红色和蓝色各使用5位,绿色使用6位。

这曾经相当普遍 - 虽然它确实降低了颜色分辨率,但结果仍然可以用于许多目的(商业图形等,但体面的照片编辑或类似颜色准确的地方事项)。