QImage的浅拷贝与深拷贝

摘要:
首先,我们来谈谈什么是浅拷贝和深拷贝:浅拷贝类似于引用类型,而深拷贝类似于值类型,即浅拷贝共享内存,而深副本复制内容。事实上,OpenCV的Mat类构造也是如此,类似于Qt中的QPixmap。

 首先简单说说什么是浅拷贝深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容。

  我们再来看看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

免责声明:文章转载自《QImage的浅拷贝与深拷贝》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇haXe下体验jQuery石头剪刀布下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java原型模式之浅拷贝-深拷贝

一、是什么?         浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象          深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制          内部机制:       (1)关于Object类的clone方法          默认实现为“浅拷贝”,重写O...

windows命令行下批量拷贝同一后缀的文件到另外一个目录

一个目录下有很多文件夹,想拷贝每个文件夹下面的wmv文件到另外一个目录,如果鼠标打开一个文件,拷贝一个,再打开其他的,逐一操作,很麻烦的,百度了一下,xcopy命令就可以实现:例如将C盘x1目录下所有的.wmv格式的文件拷贝到d盘x2目录:xcopyc:x1*.wmv/sd:x2以上命令会将x1下的子目录也拷贝到x2下如果只想拷贝文件不需要x1下的目录,可...

零拷贝

零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。实现零拷贝用到的最主要技术是 DMA 数据传输技术...

ES6的解构赋值与深拷贝和浅拷贝

昨天工作之中,前端伙伴讨论到了解构赋值到底是浅拷贝还是深拷贝,今天梳理一下。 1、ES6的解构赋值,大家应该都清楚,就是可以快速取出数组或者对象中的值;具体使用情况如下: const a = { name: 'name', age: 18, marriage: false, } let { name, age,...

关于json对象的深拷贝

前两天写程序,有一个是对后台返回的json数据进行整理然后再使用,用到了关于json 的拷贝。我在我的一篇博客中提到过对数组的拷贝。分为深度拷贝,和浅拷贝。这里附上链接其实对于数组的拷贝是比较简单的,大不了就自己循环一下,然后放到一个新数组中,或者是在我博客中提到的使用slice(0) 的办法。  同样的关于json数据的拷贝也有相同的简单方法,var 新...

Subversion命令汇总

全局选项: --username ARG   指定用户名称 ARG --password ARG   指定密码 ARG --no-auth-cache   不要缓存用户认证令牌 --non-interactive   不要交互提示 --trust-server-cert   不提示的接受未知的证书颁发机构发行的 SSL 服务器证书(只用于选项“--...