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

Storing RGB in an unsigned 16bit integer

本文关键字:整数 无符号 RGB 存储      更新时间:2023-10-16

我正在将 3 值 RGB 表示形式存储到 16 位整数中,根据此处的答案逐位移动它(将 RGB 值转换为整数)。它似乎适用于 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);

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

这曾经相当普遍 - 虽然它确实降低了颜色分辨率,但结果仍然相当适用于许多目的(商业图形等,但不是像样的照片编辑或颜色准确性很重要的类似的东西)。

您使用的是 16 位 int,并将红色值移动了 16 位,因此您实际上只是在执行r = 0。你实际上是在改变你的价值观,超过可用空间的尽头。要存储三个 8 位值,您至少需要 24 位,这意味着您必须改用 uint32_t。