2016-01-08 5 views
0

Я расширил Qt Imageviewer example с помощью некоторых функций. Я в основном хочу добавить функцию сохранения. В этом примере есть две функции одного и того же класса обработки открытого процесса изображения:C++ (Qt5.5) Расход изображения Пример просмотра с помощью функции сохранения

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 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()); 
} 

В конце концов, я хочу сохранить его как монохромное растровое изображение (независимо от того, что было раньше). Извините за размещение большого количества кода.

ответ

1

Похоже, ваша проблема в том, что у вас есть объект QPixmap, и вам нужен объект QImage. Если это так, то вы можете convert a QPixmap into a QImage by calling the toImage() method на QPixmap; он вернет результирующий объект QImage.

Что касается преобразования QImage в монохромное растровое изображение, вы должны сделать это, позвонив по convertToFormat(QImage::Format_Mono) на свой QImage. Этот вызов вернет новую (1-битную) версию QImage.

+0

'QImage test = imageLabel-> pixmap() -> toImage();' сделал трюк. Спасибо! Также вызывается упомянутый «QImage mono = test.convertToFormat (QImage :: Format_Mono);». Благодаря! – xtlc