QT转换16位QImage为8位无符号字符在QT
我想弄清楚如何将图像从uint16转换为uint8。我基本上必须读取浮动图像,我需要显示它在无符号字符。QT转换16位QImage为8位无符号字符在QT
我有以下几点:
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)));
}
}
前增量比后快?当然 - 如果编译器没有权限做一些简单的优化。对于在通用编译器上编译的生产代码,二进制文件不会有任何区别。 – mbx 2011-06-10 20:08:25
我也认为它看起来更好,所以我下意识地做它;)最重要的是,我们不知道什么编译器正在使用。我注意到这个小小的变化在LLVM和GCC编译器上产生了可证明的差异,并且它不像预增量那样慢。 – 2011-06-10 20:11:45
这个问题会比发布的内容更快 - 当然。但是你仍然将每个像素的像素设置为2个循环。即使使用'-OS'或'-O2',这种方法 – 2011-06-10 20:15:29
QImage不支持16位每通道图像:) – vines 2011-06-10 20:19:45
@vines我知道,这就是为什么我首先将16位数据(存储在'inData'向量中)转换为8位数据('outData'向量),之后使用8位数据创建QImage。 – 2011-06-10 20:21:15
啊,对不起,赶紧.. – vines 2011-06-10 20:23:03