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

ここでは、16 ビット整数を 8 ビット変数に割り当てています。

*pubuffer++ = *buffer16;

結果は未定義で、ほとんどのコンパイラは下位 8 ビットを宛先に移動するだけです。上位8ビットが欲しい

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

もう1つの問題はエンディアンです。ソース データのエンディアンによっては、 QtEndian関数の 1 つを呼び出す必要がある場合があります。

最後に、32 ビットまたは 24 ビットの Qt イメージ形式を実際に使用する必要はありません。8 ビットを使用し、カラー テーブルをグレーにQImage::Format_Indexed8設定します。

于 2012-04-22T14:36:23.657 に答える
0

バッファからピクセルの値を手動で取得して、QImage::setPixel に渡してみてください。もっと簡単にできます。

于 2012-04-22T13:57:50.187 に答える