QT实现Mat转QImage并把场景(QGraphicsScene)的Item渲染到图片

//从当前场景获取所有Item
  QList itemList = m_pScene->items();

  //1. 从读取图片
  Mat matRGB = imread("/home/mark/Desktop/opencv.bmp");
  QImage qImage(matRGB.data, matRGB.cols, matRGB.rows, QImage::Format_RGB888);

  //2. 新建一个场景与现在的一样大小,因为需要把Item渲染到image上
  QGraphicsScene *pScene = new QGraphicsScene(0, 0, matRGB.cols, matRGB.rows);
  for (int i = 0; i < itemList.count(); i++)
  {
      pScene->addItem(itemList.at(i)->clone());
  }

  //3. 在QImage基础上把场景的图形画上去
  QPainter *painter = new QPainter(&qImage);
  painter->setRenderHint(QPainter::Antialiasing);
  pScene->render(painter, qImage.rect(), qImage.rect());
  delete painter;

  //4. 渲染完毕,把新建的场景与对应的Item删除
  QList list = pScene->items();
  for (int i = list.count() - 1; i >= 0; i--)
  {
      QGraphicsItem *pItem = list.at(i);
      MYDELETE(pItem);
      list.removeAt(i);
  }
  MYDELETE(pScene);

  //因为之前获取到的Mat格式是BGR格式,而Qt是需要RGB格式,所以这里做一次RB反转
  //如果这里不做rgbSwapped(),图片的颜色是正确的

  qImage = qImage.rgbSwapped();//50ms

  qImage.save("/home/mark/Desktop/render.bmp");

你可能感兴趣的:(QT)