如何將內存圖像數據封裝成QImage
當采用Qt開發相機數據采集軟件時,勢必會遇到采集內存圖像並進行處理(如縮放、旋轉)操作。如果能夠將內存圖像數據封裝成QImage,則可以利用QImage強大的圖像處理功能來進行圖像處理,並能很好的進行顯示。
下面以灰度相機為例,介紹封裝方法:
第一步:首先根據相機的SDK內的讀圖像函數,獲取圖像數據imgData、寬度imgWidth和高度imHeight。
第二步:申請QImage對象,注意類型是Format_RGB32.
第三步:利用成員函數setPixel()設置QImage像素。由於相機輸出的圖像是灰度圖像,每一位置的R、G、B分量相等且均等於當前位置的像素值。
具體程序如下:
[cpp]
QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32
//RGB分量值
int b = 0;
int g = 0;
int r = 0;
//設置像素
for (int i=0;i<imgHeight;i++)
{
for (int j=0;j<imgWidth;j++)
{
b = (int)*(imgDataNew+i*imgWidth+j);
g = b;
r = g;
desImage.setPixel(j,i,qRgb(r,g,b));
}
}
QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32
//RGB分量值
int b = 0;
int g = 0;
int r = 0;
//設置像素
for (int i=0;i<imgHeight;i++)
{
for (int j=0;j<imgWidth;j++)
{
b = (int)*(imgDataNew+i*imgWidth+j);
g = b;
r = g;
desImage.setPixel(j,i,qRgb(r,g,b));
}
}
對於灰度圖像數據,如下封裝方式是錯誤的。
QImage desImage = QImage(imgData, imgWidth, imgHeight, QImage::Format_Indexed8)
原因是QImage的構造函數中寫道:
Constructs an image with the given width, height and format, that uses an existing memory buffer, data. The width and height must be specified in pixels, data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.