对QImage进行深拷贝

问题描述 投票:0回答:2

如何对QImage进行深拷贝?

我拥有的是这样的:

texture_img = camWorker->getImage();

QImage CamWorker::getImage(){
    QMutexLocker locker(&mutex);
    return QImg;
}

QImg 来自视频流。 但是我发现

texture_img = camWorker->getImage();
仅对 QImage 执行浅复制,并且当 QImg 在另一个线程中更改时,它会创建段错误。 深复制可以解决问题吗?

c++ qt
2个回答
20
投票

正如 Amartel 所指出的,

QImage
提供了
copy
方法。

QImage image_copy = image.copy();

请参阅此处了解更多详情。


0
投票

如果只需要执行深拷贝,那么

QImage::copy
比调用
QImage::bits
效率低。

这就是

QImage::copy
的实现方式:

QImage QImage::copy(const QRect& r) const
{
    Q_TRACE_SCOPE(QImage_copy, r);
    if (!d)
        return QImage();

    if (r.isNull()) {
        QImage image(d->width, d->height, d->format);
        if (image.isNull())
            return image;

        // Qt for Embedded Linux can create images with non-default bpl
        // make sure we don't crash.
        if (image.d->nbytes != d->nbytes) {
            int bpl = qMin(bytesPerLine(), image.bytesPerLine());
            for (int i = 0; i < height(); i++)
                memcpy(image.scanLine(i), scanLine(i), bpl);
        } else
            memcpy(image.bits(), bits(), d->nbytes);
        image.d->colortable = d->colortable;
        image.d->offset = d->offset;
        image.d->has_alpha_clut = d->has_alpha_clut;
        copyMetadata(image.d, d);
        return image;
    }
    
    // OMITTED
}

重点是

memcpy(image.bits(), bits(), d->nbytes);
。由于
QImage::bits
执行深拷贝
,所以这一行实际上带来了

的开销
  • 深度复制目标图像
  • 深复制源(如果源不是
    const
  • memcpy
    本身

如果您尝试传输高分辨率图像,那么开销可能不小。

我的推荐:

QImage copy = source;
copy.bits();

请注意,

copy
不能是
const
,因为
QImage::bits
的常量版本不执行深层复制

© www.soinside.com 2019 - 2024. All rights reserved.