概述:
最近在做项目时,遇到要把图片文件转换成二进制数据,然后将数据储存,再读出来,最后显示图片,
后期的储存和再次读取都没有什么问题,最大的问题是要确保将图片转换成二进制的数据正确,否则后面的操作就会出错变得没有意义。所以做了以下的例子。
示例:
头文件(mainwindow.h):
- /**
- * @brief 图片转化成二进制数据
- * @file mainwindow.h
- * @author 奋斗Andy
- * @version 1.0(版本号)
- * @date 2017-03-26
- */
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- private slots:
- /**
- * @brief 打开槽函数
- */
- void onOpen();
- private:
- int m_nBuffSize; /**< 有效数据长度 */
- char* m_pBuff; /**< 数据 */
- private:
- Ui::MainWindow *ui;
- };
- #endif // MAINWINDOW_H
源文件(mainwindow.cpp):
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QDataStream>
- #include <QFile>
- #include <QFileDialog>
- #include <QImage>
- #include <QMessageBox>
- #include <QPixmap>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent), m_nBuffSize(0), m_pBuff(NULL),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- connect(ui->m_pOpen, SIGNAL(triggered()), this, SLOT(onOpen()));
- }
- MainWindow::~MainWindow()
- {
- if (m_pBuff != NULL)
- {
- delete m_pBuff;
- m_pBuff = NULL;
- }
- delete ui;
- }
- void MainWindow::onOpen()
- {
- //获取图片文件
- QString strFileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files(*.jpg *.png *.bmp)"));
- if (strFileName.isEmpty())
- {
- QMessageBox::information(NULL, tr("Warning"), tr("You didn't select any files."));
- return;
- }
- QFile file(strFileName);
- if (!file.open(QIODevice::ReadOnly))
- {
- QMessageBox::information(NULL, tr("Warning"), tr("File open fail."));
- return;
- }
- //先释放内存
- if (m_pBuff != NULL)
- {
- delete m_pBuff;
- m_pBuff = NULL;
- }
- //确保内存分配成功
- int nSize = file.size();
- do
- {
- m_pBuff = new char[nSize + 1];
- }while (m_pBuff == NULL);
- QDataStream in(&file);
- //需要的有效长度为函数返回值,并非nSize
- m_nBuffSize = in.readRawData(m_pBuff, nSize);
- //读取失败则结束操作
- if (m_nBuffSize == -1)
- {
- return;
- }
- //验证读取的数据,通过转化成图片显示出来
- QImage image;
- image.loadFromData(reinterpret_cast<unsigned char*>(m_pBuff), m_nBuffSize);
- ui->m_pLabel->setPixmap(QPixmap::fromImage(image));
- }
main.cpp:
- #include "mainwindow.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
显示效果图:
总结:
要想数据获取正确,一定要确保buffSize的正确,最后显示出来的时候buffSize十分重要。一个图片也是一个文件,但buffSize并非为文件的大小。
转载地址:http://blog.csdn.net/andy_93/article/details/66472669