我将3值RGB表示存储到16位整数中,通过根据此处的答案进行位移(Convert RGB values to Integer)。它似乎适用于g
和b
值,但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);
答案 0 :(得分:5)
你正在使用16位int,并将红色值移动16位,所以你实际上只是在做r = 0
。您实际上是将值移到可用空间的末尾。要存储三个8位值,您需要至少24位,这意味着您将不得不使用uint32_t。
答案 1 :(得分:5)
如果需要以16位整数存储RGB,则只能存储分辨率有限的颜色。通常,红色和蓝色各使用5位,绿色使用6位。
这曾经相当普遍 - 虽然它确实降低了颜色分辨率,但结果仍然可以用于许多目的(商业图形等,但不体面的照片编辑或类似颜色准确的地方事项)。