1

我正在尝试从 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/

我究竟做错了什么?谢谢。

4

2 回答 2

0

Try to get values of pixels from buffer manually and pass it to QImage::setPixel. It can be simplier.

于 2012-04-22T13:57:50.187 回答
0

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

*pubuffer++ = *buffer16;

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

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

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

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

于 2012-04-22T14:36:23.657 回答