在QT中将16位QImage转换为8位无符号字符
Convert 16bit QImage to 8bit unsigned char in QT
我正试图弄清楚如何将图像从uint16转换为uint8。我基本上必须以浮点形式读取图像,并且我需要以无符号字符形式显示它。
我有以下内容:
float two_eight = pow(2.0,8);
float two_sixteen = pow(2.0,16);
QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
for (int i = 0 ; i < imheight ; i++)
{
for (int j = 0 ; j < imwidth ; j++)
{
floatData[i*imwidth+j] = (two_eight* floatData[i*imwidth+j])/two_sixteen;
qi->setPixel(j,i,qRgb((unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j]));
}
}
在Qt中有更好的方法来实现这一点吗?
如果我正确理解你的问题,你得到了一个RGB格式的图像,其中每个颜色分量是16位,你想用QImage加载它。
你可以这样做:
std::vector< unsigned short int > inData;
// load the data into a vector
std::vector< unsigned char > outData( inData.size(), 0 );
std::transfrorm( inData.begin(), inData.end(), outData.begin(), Convert );
// create the image object
QImage image( &outData[0],imwidth, imheight, QImage::Format_RGB32 );
其中Convert
函数定义如下:
unsigned char Convert( const unsigned short int v )
{
return v >> 8;
}
imdata是您的16位图像缓冲
#include <cstdint>
uint16_t *imdata;
for (int i = 0 ; i < imheight ; ++i)
{
//preincrement, is faster than post
for (int j = 0 ; j < imwidth ; ++j)
{
//imdata[i*imwidth+j]>>8 removes least significant 8bits
//imdata has one added to adjust for components
qi->setPixel(j,i,qRgb((uint8_t)(imdata[i*imwidth+j]>>8),(uint8_t)(imdata[i*imwidth+j+1]>>8),(uint8_t)(imdata[i*imwidth+j+2]>>8)));
}
}
相关文章:
- 如何打印boost多精度128位无符号整数
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将 16 位无符号 int 转换为 8 位无符号字符并最终返回无符号字符*?
- 如何在 c++ 中输入 128 位无符号整数
- 如何将 32 位有符号整数放入更高的 32 位 64 位无符号整数中
- 高效实现 64 位和 32 位无符号整数之间的双向映射
- 在 x86-64 平台上为 C(++) 中的 64 位无符号参数计算 (a*b)%n FAST
- 32位操作系统支持64位无符号整数!!如何
- 迁移一个哈希函数,其中包含从 C++/Qt 到 Java 的 32 位无符号整数
- C++ 将字符串转换为 16 位无符号/有符号的 int/float
- C# 相当于 64 位无符号长 C++
- Qt5将字符转换为8位无符号值
- HDF5在磁盘上将32位无符号int写入64位,并读取32位无信号int
- 32位和64位无符号整数的位移位
- 4个有符号字节打包成32位无符号字节
- 64位无符号减法问题
- 在opengl中显示16位无符号整数
- 64位向量的点积速度比32位无符号整型向量快两倍
- 在QT中将16位QImage转换为8位无符号字符