最近在做项目时,遇到要把图片文件转换成二进制数据,然后将数据储存,再读出来,最后显示图片,
后期的储存和再次读取都没有什么问题,最大的问题是要确保将图片转换成二进制的数据正确,否则后面的操作就会出错变得没有意义。所以做了以下的例子。
/**
* @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
#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));
}
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。