zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    db4o 7.4 for .net3.5试用手记
    ruby学习笔记(2)类的基本使用
    温故而知新:设计模式之适配器模式(Adapter)
    Silverlight:Dependency Property(依赖属性)学习笔记
    Silverlight中的帧
    关闭与恢复visual studio实时调试器
    温故而知新:设计模式之桥接模式(Bridge)
    温故而知新:设计模式之单件模式(Singleton)
    一段oracle中的“复杂”分组统计sql
    VisualTreeHelper
  • 原文地址:https://www.cnblogs.com/findumars/p/6294130.html
Copyright © 2011-2022 走看看