在Qt

时间:2018-05-31 15:11:55

标签: c++ qt

请看下面的代码图片是类型 QImage 的类成员。

void ImageViewer::setImage(const QImage &newImage)
{
Image = newImage; // takes 108 milliseconds
imageLabel->setPixmap(QPixmap::fromImage(Image)); // takes 58 milliseconds
}

因为我不再需要将 newImage 设置为图像类成员,我只需使用 newImage 的引用并节省时间。但我很惊讶。

void ImageViewer::setImage(const QImage &newImage)
{
imageLabel->setPixmap(QPixmap::fromImage(newImage)); // takes 158 milliseconds
}

需要同样的时间。我在这里缺少什么?

编辑对于那些想知道我测量时间的人,我使用QElapsedTimer建议here

图像每次都是相同的代码是自定义滚动的一部分。每次我们输入此功能时,您必须知道的相同图像(.jpg)大小为2380x3368。每次评论中的测量时间都是相同的时间。

但个人认为图像格式或尺寸不是这里的主要问题。主要问题应该是为什么SetPixmap在使用ref到现有QImage时需要花费更多时间,而不是创建一个新的QImage,然后将其发送到此函数。这没有任何意义。

2 个答案:

答案 0 :(得分:1)

来自文档:http://doc.qt.io/qt-5/qimage.html#operator-eq

  

QImage& QImage :: operator =(const QImage& image)   将给定图像的副本指定给此图像,并返回对此图像的引用。

因此,我们可以确定您的两个代码块实际上是等效的,因为制作映像的写时复制副本基本上是一个自由操作(当查看毫秒时间尺度时)。

在第一个示例中花费大量时间进行初始复制的事实可能是您对代码进行基准测试的工件。

编辑写时复制意味着ImagenewImage在分配后共享基础数据,并将按需制作数据副本时间其中一个分歧。实际上,它并不比复制指针贵得多。

答案 1 :(得分:0)

QPixmap是围绕特定格式的内部QImage的精简包装。您需要将您的调用分解为两个独立的调用,并确定格式转换是否需要时间 - 这是图像到像素映射转换需要花费大量时间的唯一方法。当源图像具有正确的格式时,转换就不会花费任何时间。

void ImageViewer::setImage(const QImage &newImage) {
  static auto const format = QPixmap(1,1).toImage().format();
  if (format != newImage.format())
    qWarning("There is a format conversion. This won't be fast.");
  QElapsedTimer timer;
  timer.start();
  auto const pixmap = QPixmap::fromImage(newImage);
  auto time = timer.elapsed();
  qDebug() << "Pixmap conversion took" << time << "ms.";
  imageLabel->setPixmap(pixmap);
  time = timer.elapsed();
  qDebug() << "Pixmap setting took" << time << "ms.";
}