将 RGB 存储在无符号的 16 位整数中
Storing RGB in an unsigned 16bit integer
我正在将 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);
如果需要将 RGB 存储在 16 位整数中,则只能存储分辨率有限的颜色。通常,红色和蓝色各使用 5 位,绿色使用 6 位。
这曾经相当普遍 - 虽然它确实降低了颜色分辨率,但结果仍然相当适用于许多目的(商业图形等,但不是像样的照片编辑或颜色准确性很重要的类似的东西)。
您使用的是 16 位 int,并将红色值移动了 16 位,因此您实际上只是在执行r = 0
。你实际上是在改变你的价值观,超过可用空间的尽头。要存储三个 8 位值,您至少需要 24 位,这意味着您必须改用 uint32_t。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- 将最小值整数转换为无符号长整型
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 将二进制编码的无符号字符转换为整数
- 添加有符号和无符号整数