图片与二进制数据的转换

28 篇文章 2 订阅

概述:

最近在做项目时,遇到要把图片文件转换成二进制数据,然后将数据储存,再读出来,最后显示图片,

后期的储存和再次读取都没有什么问题,最大的问题是要确保将图片转换成二进制的数据正确,否则后面

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

示例:

头文件(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并非为文件的大小。
  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值