如何对QImage进行深拷贝?
我拥有的是这样的:
texture_img = camWorker->getImage();
QImage CamWorker::getImage(){
QMutexLocker locker(&mutex);
return QImg;
}
QImg 来自视频流。 但是我发现
texture_img = camWorker->getImage();
仅对 QImage 执行浅复制,并且当 QImg 在另一个线程中更改时,它会创建段错误。
深复制可以解决问题吗?
如果只需要执行深拷贝,那么
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
的常量版本不执行深层复制。