如何在Qt中打印uint16单色图像?

如何在Qt中打印uint16单色图像?,qt,monochrome,uint16,Qt,Monochrome,Uint16,我正在尝试从Dicom文件打印图像。我将原始数据传递给ConvertToFormatRGB888函数。据我所知,Qt无法处理16位单色图像 以下是原始图像(此处转换为jpg): 在这个函数中,我进入了这个 ... else if (gimage.GetPixelFormat() == gdcm::PixelFormat::UINT16) { short *buffer16 = (short*)buffer; unsigned char *ubuffer

我正在尝试从Dicom文件打印图像。我将原始数据传递给ConvertToFormatRGB888函数。据我所知,Qt无法处理16位单色图像

以下是原始图像(此处转换为jpg):

在这个函数中,我进入了这个

...
else if (gimage.GetPixelFormat() == gdcm::PixelFormat::UINT16)
    {
        short *buffer16 = (short*)buffer;
        unsigned char *ubuffer = new unsigned char[dimX*dimY*3];
        unsigned char *pubuffer = ubuffer;
        for (unsigned int i = 0; i < dimX*dimY; i++)
        {
             *pubuffer++ = *buffer16;
             *pubuffer++ = *buffer16;
             *pubuffer++ = *buffer16;
              buffer16++;
        }
        imageQt = new QImage(ubuffer, dimX, dimY, QImage::Format_RGB888);
...
。。。
else if(gimage.GetPixelFormat()==gdcm::PixelFormat::UINT16)
{
short*buffer16=(short*)缓冲区;
unsigned char*ubuffer=新的unsigned char[dimX*dimY*3];
无符号字符*pubuffer=ubuffer;
for(无符号整数i=0;i
此代码在此基础上稍作修改: gdcm.sourceforge.net/2.0/html/ConvertToQImage_8cxx-example.html

但原来的那个我有一个执行错误。用我的至少我得到了一个图像,但它不一样

以下是新图像(此处转换为jpg):

我做错了什么?
谢谢。

尝试手动从缓冲区获取像素值,并将其传递给QImage::setPixel。它可以更简单。

您正在为8位变量分配16位整数:

*pubuffer++ = *buffer16;
结果是未定义的,大多数编译器只是将低8位移到目标。您想要高8位

*pubuffer++ = (*buffer16) >> 8;
另一个问题是endianness。根据源数据的类型,您可能需要调用其中一个函数


最后,您实际上不需要使用任何32位或24位Qt图像格式。使用8位
QImage::Format_Indexed8
并将设置为灰色。

使用第一个建议,我得到了以下图像:颜色要暗得多,但更接近所需的颜色。现在我正在尝试更改颜色表,但我迷路了。我将阅读Qt的文档和谷歌,看看我是否能改进这一点。我试着用QVector表(256);for(inti=0;I<256;++I){table[I]=qRgb(I,I,I);}imageQt->setColorTable(table);我得到了相同的图像。我被卡住了。如何将buffer16的类型更改为unsigned short?从unsigned转换为signed的类型可能会出错。嗯,我得到了相同的暗图像。另一件事:原始图像返回true,并带有“if”(gimage.getphotommetricinterpretation()==gdcm::photommetricinterpretation::monocare2)我不知道我是否应该在ubuffer中乘以3…看起来像是gdcm的问题。我对gdcm一点都不熟悉。对不起。
*pubuffer++ = (*buffer16) >> 8;