图片与二进制数据的转换

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

概述:

最近在做项目时,遇到要把图片文件转换成二进制数据,然后将数据储存,再读出来,最后显示图片, 后期的储存和再次读取都没有什么问题,最大的问题是要确保将图片转换成二进制的数据正确,否则后面

的操作就会出错变得没有意义。所以做了以下的例子。

示例:

头文件(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并非为文件的大小。

点这里可以跳转到人工智能网站

发表评论