QImage的浅拷贝与深拷贝

111 篇文章 9 订阅

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

    我们再来看看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的构造行数是否是深/浅拷贝。

 

参考:

https://www.yuque.com/docs/share/fdaf06b4-3b3d-491a-b069-c6c2767fef97

在C++中,QImage是Qt框架中用于处理图像的类。浅拷贝深拷贝是关于对象拷贝的概念。 浅拷贝是指将一个对象的值复制到另一个对象,这两个对象将共享相同的数据。在浅拷贝中,只复制了指针,而没有复制指针所指向的数据。这意味着如果其中一个对象修改了共享的数据,另一个对象也会受到影响。 深拷贝是指将一个对象的值复制到另一个对象,这两个对象将拥有独立的数据。在深拷贝中,不仅复制了指针,还复制了指针所指向的数据。这样,即使其中一个对象修改了数据,另一个对象也不会受到影响。 下面是使用C++代码进行浅拷贝深拷贝的示例: ```cpp #include <iostream> #include <QImage> int main() { // 创建原始图像 QImage originalImage("path_to_image.jpg"); // 浅拷贝 QImage shallowCopyImage = originalImage; // 深拷贝 QImage deepCopyImage = originalImage.copy(); // 修改浅拷贝图像 shallowCopyImage.setPixelColor(0, 0, QColor(Qt::red)); // 输出原始图像的第一个像素颜色 std::cout << "Original Image Pixel Color: " << originalImage.pixelColor(0, 0).name().toStdString() << std::endl; // 输出浅拷贝图像的第一个像素颜色 std::cout << "Shallow Copy Image Pixel Color: " << shallowCopyImage.pixelColor(0, 0).name().toStdString() << std::endl; // 输出深拷贝图像的第一个像素颜色 std::cout << "Deep Copy Image Pixel Color: " << deepCopyImage.pixelColor(0, 0).name().toStdString() << std::endl; return 0; } ``` 在上面的示例中,我们首先创建了一个原始图像`originalImage`。然后使用浅拷贝深拷贝分别创建了`shallowCopyImage`和`deepCopyImage`。接着,我们修改了浅拷贝图像的第一个像素颜色,并输出了原始图像、浅拷贝图像和深拷贝图像的第一个像素颜色。 运行上述代码,你会发现原始图像和深拷贝图像的第一个像素颜色没有改变,而浅拷贝图像的第一个像素颜色变为了红色。这是因为浅拷贝只是复制了指针,而深拷贝复制了指针所指向的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值