QImage的淺拷貝與深拷貝


 首先簡單說說什么是淺拷貝深拷貝:淺拷貝就比如像引用類型,而深拷貝就比如值類型,即淺拷貝是共用一塊內存的,而深拷貝是復制一份內容。

  我們再來看看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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM