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