如何在QT中从qgraphicsview保存编辑过的图像

时间:2014-03-10 19:31:11

标签: c++ image qt

我正在编写代码以从文件加载图像并对此图像进行一些编辑(更改某些像素的值),放大或缩小然后保存图像。我尝试使用qgraphicview和qgraphicsscene来保存图像。但是,当我尝试保存图像时,它总是保存场景的可见区域。我的目的是以原始分辨率保存编辑过的图像。以下是我的代码。 装货部分:

void ImageViewer::loadFile(const QString &fileName)
{
    if (!fileName.isEmpty()) {
        image = new QImage(fileName);
        if (image->isNull()) {
            QMessageBox::information(this, tr("Image Viewer"),
                tr("Cannot load %1.").arg(fileName));
            return;
        }
        qgraphicsscene = myqgraphicsview->getScene();
        qgraphicsscene->setSceneRect(image->rect());
        myqgraphicsview->setScene(qgraphicsscene);
        qgraphicsscene->addPixmap(QPixmap::fromImage(*image));
        currentName = fileName;
    }
}

保存部分:

QPixmap pixMap = QPixmap::grabWidget(myqgraphicsview);
    pixMap.save(fileName);

我认为问题可能在于节省一部分。我试图在QGraphicsScene中找到一个可以从中提取图像的方法,但是失败了。有人可以帮忙吗?非常感谢!!!

1 个答案:

答案 0 :(得分:1)

addPixmap方法返回QGraphicsPixmapItem*。你需要记住它,并用它来保存像素图。例如:

class ImageViewer {
  QGraphicsView * m_view;
  QString m_currentName;
  QGraphicsPixmapItem * m_item;
  ...
};

ImageViewer::ImageViewer() : m_item(nullptr) { ... }

void ImageViewer::loadFile(const QString &fileName)
{
  if (fileName.isEmpty()) return;
  QImage image(fileName);
  if (image.isNull()) {
    QMessageBox::information(this, tr("Image Viewer"),
      tr("Cannot load %1.").arg(fileName));
    return;
  }
  QGraphicsScene * scene = m_view->scene();
  scene->setSceneRect(image->rect());
  m_item = scene->addPixmap(QPixmap::fromImage(image));
  m_currentName = fileName;
}

void ImageViewer::save()
{
  if (!m_item) return;
  QSaveFile file(m_currentName);
  if (! file.open(QIODevice::WriteOnly | QIODevice::Unbuffered)) {
    QMessageBox::information(this, tr("Image Viewer"),
      tr("Cannot save %1.").arg(m_currentName));
    return;
  }
  QImage const image = m_item->pixmap().toImage();
  image.save(&file);
  file.commit();
}