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 位)版本。
我通过一些功能扩展了 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 位)版本。