Конвертировать 16-битный QImage в 8-битный беззнаковый символ в QT - PullRequest
2 голосов
/ 10 июня 2011

Я пытаюсь выяснить, как преобразовать изображение из uint16 в uint8. Я в основном должен прочитать изображение в формате с плавающей точкой, и мне нужно отобразить его в неподписанном символе.

У меня есть следующее:

   float two_eight =  pow(2.0,8);
   float two_sixteen = pow(2.0,16);
    QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
        for (int i = 0 ; i < imheight ; i++)
        {
             for (int j = 0 ; j < imwidth ; j++)
             {
                    floatData[i*imwidth+j] = (two_eight* floatData[i*imwidth+j])/two_sixteen;
                    qi->setPixel(j,i,qRgb((unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j],(unsigned char)floatData[i*imwidth+j]));


             }
         }

Есть ли лучший способ выполнить это в Qt?

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Если я правильно понимаю ваш вопрос, вы получили изображение в формате RGB, в котором каждый компонент цвета составляет 16 бит, и вы хотите загрузить его с помощью QImage.

Вы можете сделать это следующим образом:

std::vector< unsigned short int > inData;
// load the data into a vector
std::vector< unsigned char > outData( inData.size(), 0 );
std::transfrorm( inData.begin(), inData.end(), outData.begin(), Convert );
// create the image object
QImage image( &outData[0],imwidth, imheight, QImage::Format_RGB32 );

, где функция Convert определяется следующим образом:

unsigned char Convert( const unsigned short int v )
{
  return v >> 8;
}
1 голос
/ 10 июня 2011

imdata - это ваш 16-битный буфер изображений

#include <cstdint>    
uint16_t *imdata;

    for (int i = 0 ; i < imheight ; ++i)
            {
                 //preincrement, is faster than post
                 for (int j = 0 ; j < imwidth ; ++j)
                 {
                        //imdata[i*imwidth+j]>>8 removes least significant 8bits
                        //imdata has one added to adjust for components
                        qi->setPixel(j,i,qRgb((uint8_t)(imdata[i*imwidth+j]>>8),(uint8_t)(imdata[i*imwidth+j+1]>>8),(uint8_t)(imdata[i*imwidth+j+2]>>8)));


                 }
             }
...