C++(Qt5.5)通过保存功能扩展图片查看器实例

C++ (Qt5.5) expend image Viewer example by save function

我通过一些功能扩展了 Qt Imageviewer example。我基本上想添加一个保存功能。在这个例子中有两个相同的函数 class 处理图片打开过程:

void ImageViewer::open()
{
    QStringList mimeTypeFilters;
    foreach (const QByteArray &mimeTypeName, QImageReader::supportedMimeTypes())
        mimeTypeFilters.append(mimeTypeName);
    mimeTypeFilters.sort();
    const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
    QFileDialog dialog(this, tr("Open File"),
                       picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last());
    dialog.setAcceptMode(QFileDialog::AcceptOpen);
    dialog.setMimeTypeFilters(mimeTypeFilters);
    dialog.selectMimeTypeFilter("image/jpeg");

    while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {}
}

bool ImageViewer::loadFile(const QString &fileName)
{
    QImageReader reader(fileName);
    reader.setAutoTransform(true);
    const QImage image = reader.read();
    if (image.isNull()) {
        QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
                                 tr("Cannot load %1.").arg(QDir::toNativeSeparators(fileName)));
        setWindowFilePath(QString());
        imageLabel->setPixmap(QPixmap());
        imageLabel->adjustSize();
        return false;
}
    imageLabel->setPixmap(QPixmap::fromImage(image));
    scaleFactor = 1.0;

    printAct->setEnabled(true);
    fitToWindowAct->setEnabled(true);
    convAct->setEnabled(true); // so the image can be converted if it was loaded ...
    updateActions();

    if (!fitToWindowAct->isChecked()) {
        imageLabel->adjustSize();
    }
    setWindowFilePath(fileName);
    return true;
    }

所以我在菜单中添加了一个保存按钮,在 ImageViewer.h class:

class ImageViewer : public QMainWindow
{
    Q_OBJECT

public:
    ImageViewer();
    bool loadFile(const QString &);

private slots:
    void open();
    void print();
    void save();  // <--- 

一切都很好,但我不知道如何在新函数中获取我的图像,此外,我显然从 QPixmap 到 QImage 的转换是错误的 - 但我也尝试用 QPixmap test = imageLabel->pixmap() 没有任何成功。

void ImageViewer::save()
{
    QImage test = imageLabel->pixmap();
    qWarning()<< test;
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);
    image.save(&buffer, "BMP");
    QString monobitmap = QString::fromLatin1(bytes.toBase64().data());
}   

最后,我想把它保存为单色位图(不管之前是什么)。抱歉发布了很多代码。

听起来你的问题是你有一个 QPixmap 对象并且你需要一个 QImage 对象。如果是这样,那么你可以在QPixmap上convert a QPixmap into a QImage by calling the toImage() method;它将 return 生成 QImage 对象。

至于将 QImage 转换为单色位图,您应该可以通过在 QImage 上调用 convertToFormat(QImage::Format_Mono) 来完成。该调用将 return QImage 的新(1 位)版本。