2011-06-10 176 views
2

我想弄清楚如何將圖像從uint16轉換爲uint8。我基本上必須讀取浮動圖像,我需要顯示它在無符號字符。QT轉換16位QImage爲8位無符號字符在QT

我有以下幾點:

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中執行這個更好的方法?

回答

1

如果我正確理解你的問題,你有在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; 
} 
+0

QImage不支持16位每通道圖像:) – vines 2011-06-10 20:19:45

+0

@vines我知道,這就是爲什麼我首先將16位數據(存儲在'inData'向量中)轉換爲8位數據('outData'向量),之後使用8位數據創建QImage。 – 2011-06-10 20:21:15

+0

啊,對不起,趕緊.. – vines 2011-06-10 20:23:03

1

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


       } 
      } 
+0

前增量比後快?當然 - 如果編譯器沒有權限做一些簡單的優化。對於在通用編譯器上編譯的生產代碼,二進制文件不會有任何區別。 – mbx 2011-06-10 20:08:25

+0

我也認爲它看起來更好,所以我下意識地做它;)最重要的是,我們不知道什麼編譯器正在使用。我注意到這個小小的變化在LLVM和GCC編譯器上產生了可證明的差異,並且它不像預增量那樣慢。 – 2011-06-10 20:11:45

+0

這個問題會比發佈的內容更快 - 當然。但是你仍然將每個像素的像素設置爲2個循環。即使使用'-OS'或'-O2',這種方法 – 2011-06-10 20:15:29

相關問題