首先簡單說說什么是淺拷貝和深拷貝:淺拷貝就比如像引用類型,而深拷貝就比如值類型,即淺拷貝是共用一塊內存的,而深拷貝是復制一份內容。
我們再來看看QImage類的幾個構造函數:
// 淺拷貝 QImage(uchar * data, int width, int height, Format format) // 淺拷貝 QImage(const uchar * data, int width, int height, Format format) // 淺拷貝 QImage(uchar * data, int width, int height, int bytesPerLine, Format format) // 淺拷貝 QImage(const uchar * data, int width, int height, int bytesPerLine, Format format) // 深拷貝 QImage QImage::copy(const QRect & rectangle = QRect()) const // 淺拷貝 QImage QImage::rgbSwapped() const
從構造函數可以得知只要知道:
- 指向圖像數據的uchar*型地址
- 圖像寬度
- 圖像高度
- 圖像格式或者是圖像的每行字節數(通道*寬度)
那么就可以構造出一個QImage的實體,而這里討論的是,這個實體是與傳入構造函數的圖像數據地址指向的內存塊是同一塊內存,即淺拷貝。其實在OpenCV的Mat類構造也是如此,類似的還有Qt中的QPixmap。
// 拷貝構造函數,深拷貝 QPixmap::QPixmap(const QPixmap & pixmap) // 淺拷貝 QPixmap & QPixmap::operator=(const QPixmap & pixmap) // 深拷貝 QPixmap QPixmap::copy(const QRect & rectangle = QRect()) const
最后,可以去做個實驗來驗證,讀取指定大小的一張圖像到開辟好的內存塊dataBuffer中–>通過這個內存塊和圖像相關信息構造一個QImage實體qimg–>顯示qimg–>將dataBuffer清空(memset)–>顯示qimg ,來判斷QImage的構造行數是否是深/淺拷貝。
http://blog.csdn.net/freeape/article/details/52614700
