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

时间:2012-04-22 13:53:23

标签: qt monochrome uint16

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

这是原始图片(此处转换为jpg): http://imageshack.us/photo/my-images/839/16bitc.jpg/

bool convertToFormat_RGB888(gdcm::Image const & gimage, char *buffer, QImage* &imageQt)

在这个功能里面,我进入了这个......

...
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);
...

这段代码有点适应: gdcm.sourceforge.net/2.0/html/ConvertToQImage_8cxx-example.html

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

这是新图片(此处转换为jpg): http://imageshack.us/photo/my-images/204/8bitz.jpg/

我做错了什么? 感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您在此处将16位整数分配给8位变量:

*pubuffer++ = *buffer16;

结果未定义,大多数编译器只将低8位移动到目标。你想要高8位

*pubuffer++ = (*buffer16) >> 8;

另一个问题是字节序。根据源数据的endianness,您可能需要调用其中一个QtEndian函数。

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