我正在编写代码以从文件加载图像并对此图像进行一些编辑(更改某些像素的值),放大或缩小然后保存图像。我尝试使用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中找到一个可以从中提取图像的方法,但是失败了。有人可以帮忙吗?非常感谢!!!
答案 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();
}