QT從5.12版本開始,增加了QImage::Format_RGBX64、QImage::Format_RGBA64、QImage::Format_RGBA64_Premultiplied等一系列圖像格式,使得顯示16位位深色彩圖像成為可能,讀寫16位tiff圖像終於不用先放縮到8位再顯示了(淚目);從5.13版本開始增加了QImage::Format_Grayscale16這種16位位深灰度圖像格式。
構造圖像
構造16位圖像,原始數據應是ushort類型而不是8位圖像時的uchar類型,單個色彩的范圍為0~65535而不是之前的0~255。添加圖像數據時,原本使用setPixelColor()設置QRgba64類型的色彩,發現程序的運行效率不高,構造圖像的時間比較長。事實上,QT自己的官方文檔都說了setPixelColor()是一個效率很低的函數,不建議使用它來構造圖像。
1 QImage tempImg = QImage(width, height, QImage::Format_RGBX64); 2
3 int bitCount = 0,index= 0; 4 ushort nowColor; 5 for (int j = 0; j < height; j++) 6 { 7 for (int i = 0; i < width; i++) 8 { 9 //放縮數據到0~65535,orignalData為float類型
10 nowColor = (ushort)((orignalData[index] - limitMin) * 65535 / (limitMax - limitMin)); 11 index++; 12
13 //注:setPixelColor()函數是非常耗時的操作
14 uchar* bit = tempImg.scanLine(j) + i * 8; 15 memcpy(bit, &nowColor, 2); 16 memcpy(bit+2, &nowColor, 2); 17 memcpy(bit+4, &nowColor, 2); 18 ushort maxNum = 0xffff; 19 memcpy(bit + 6, &maxNum, 2); 20 //tempImg.setPixelColor(i, j, QColor::fromRgba64(nowColor, nowColor, nowColor));
21 } 22 }
顯示圖像
運行程序后,發現16位位深圖像和之前的8位位深圖像並沒有太大的區別,一度懷疑自己沒寫正確。后來發現是自己電腦顯示器只能顯示8位位深圖像的緣故。實際上,現在大部分的電腦都還只能顯示8位位深圖像,改不改成16位位深圖像,看自己的硬件配置(以及老板的要求)。