【问题标题】:how to print a uint16 monochrome image in Qt?如何在 Qt 中打印 uint16 单色图像?
【发布时间】:2012-04-22 13:53:22
【问题描述】:

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

我做错了什么? 谢谢。

【问题讨论】:

    标签: qt monochrome uint16


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您在这里将 16 位整数分配给 8 位变量:

      *pubuffer++ = *buffer16;
      

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

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

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

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

      【讨论】:

      • 使用第一个建议,我得到了这个图像:imageshack.us/photo/my-images/802/answer.jpg 它要暗很多,但更接近所需的图像。现在我正在尝试更改颜色表,但我迷路了。我会阅读 Qt 的文档和谷歌,看看我是否可以改进这一点。
      • 我尝试使用 QVector 表(256)更改颜色表; for( int i = 0; i setColorTable(table);我得到相同的图像。我被困住了。
      • 把buffer16的类型改为unsigned short怎么样?从无符号到有符号的类型转换可能搞砸了。
      • 嗯,我得到了同样的暗图像。另一件事:原始图像使用“if (gimage.GetPhotometricInterpretation() == gdcm::PhotometricInterpretation::MONOCHROME2)”返回 true。我不知道是否应该在 ubuffer 中乘以 3...
      • 看起来像一些 gdcm 问题。我根本不熟悉gdcm。对不起。
      猜你喜欢
      • 2018-12-03
      • 2014-03-25
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多