如何將內存圖像數據封裝成QImage
阿新 • • 發佈:2018-04-05
HA BE else 版本 body pix 取圖 bmp oid
博客轉載自:https://blog.csdn.net/lg1259156776/article/details/52318638
當采用Qt開發相機數據采集軟件時,勢必會遇到采集內存圖像並進行處理(如縮放、旋轉)操作。如果能夠將內存圖像數據封裝成QImage,則可以利用QImage強大的圖像處理功能來進行圖像處理,並能很好的進行顯示。下面以灰度相機為例,介紹封裝方法:
第一步:首先根據相機的SDK內的讀圖像函數,獲取圖像數據imgData、寬度imgWidth和高度imHeight。 第二步:申請QImage對象,註意類型是Format_RGB32. 第三步:利用成員函數setPixel()設置QImage像素。由於相機輸出的圖像是灰度圖像,每一位置的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.
8位灰度圖封裝
在內存中,8bit灰度圖像的寬度有可能不能滿足BMP格式需求(為4的倍數),在封裝成8bit灰度QImage時,會遇到封裝不完整或錯誤的問題。本人總結了該問題,寫了一個封裝內存8bit灰度圖像數據的C++類
首先看代碼部分:BufferToQImage.h
/* * Copyright (c) 2013,中科院蘇州醫工所 * All rights reserved. * * 當前版本:1.0 * 作 者:LYC * 完成日期:2013年6月27日 */ #ifndef BUFFERTOQIMAGE_H #define BUFFERTOQIMAGE_H #include <QImage> #include <Windows.h> #include <assert.h> #include <QVector> class BufferToQImage { public: BufferToQImage(void); ~BufferToQImage(void); public: QImage Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight); //將8bit灰度數據封裝成QImage private: QVector<QRgb> vcolorTable; //生成灰度顏色表 }; #endif
//BufferToQImage.cpp
/* * Copyright (c) 2013,中科院蘇州醫工所 * All rights reserved. * * 摘 要:將內存數據封裝成QImage。 * * 當前版本:1.0 * 作 者:LYC * 完成日期:2013年6月27日 */ #include "BufferToQImage.h" BufferToQImage::BufferToQImage(void) { for (int i = 0; i < 256; i++) { vcolorTable.append(qRgb(i, i, i)); } } BufferToQImage::~BufferToQImage(void) { } /* * 函數名:Pk8bitGrayToQIm() * 功能:將8bit灰度數據封裝成QImage * 參數: * pBuffer - 內存數據指針 * bufWidth - 內存數據寬度 * bufHight - 內存數據高度 * 返回值:QImage * 作者:LYC * 時間:2013.6.27 */ QImage BufferToQImage::Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight) { //對參數的有效性進行檢查 assert((pBuffer != NULL) && (bufWidth>0) && (bufHight>0)); int biBitCount = 8; //灰度圖像像素bit數 int lineByte = (bufWidth * biBitCount/8 + 3) / 4 * 4; //bmp行byte數(格式寬度,為4的倍數) if (bufWidth == lineByte) //判斷圖像寬度與格式寬度 { QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8); //封裝QImage qIm.setColorTable(vcolorTable); //設置顏色表 return qIm; } else { BYTE *qImageBuffer = new BYTE[lineByte * bufHight]; //分配內存空間 uchar *QImagePtr = qImageBuffer; for (int i = 0; i < bufHight; i++) //Copy line by line { memcpy(QImagePtr, pBuffer, bufWidth); QImagePtr += lineByte; pBuffer += bufWidth; } QImage qImage = QImage(qImageBuffer, bufWidth, bufHight, QImage::Format_Indexed8); //封裝QImage qImage.setColorTable(vcolorTable); //設置顏色表 return qImage; } }
利用我的博客中**任意寬度灰度BMP圖像讀寫 V2 ** 的程序,可以讀取任意寬度的圖像,選擇能夠返回有效圖像數據的成員函數,可以模擬相機寫入內存中的數據。我利用rd8BitBmpNtFmt()讀取78*86的圖像,利用上述成員函數將內存的圖像數據封裝成QImage,並原尺寸顯示和512*512放大顯示,效果如下
如何將內存圖像數據封裝成QImage