Qt:图片与二进制数据的转换

概述:

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

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

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

示例:

头文件(mainwindow.h):

[cpp]  view plain  copy
  1. /** 
  2.   *  @brief    图片转化成二进制数据 
  3.   *  @file     mainwindow.h 
  4.   *  @author   奋斗Andy 
  5.   *  @version  1.0(版本号) 
  6.   *  @date     2017-03-26 
  7.   */  
  8. #ifndef MAINWINDOW_H  
  9. #define MAINWINDOW_H  
  10.   
  11. #include <QMainWindow>  
  12.   
  13. namespace Ui {  
  14. class MainWindow;  
  15. }  
  16.   
  17. class MainWindow : public QMainWindow  
  18. {  
  19.     Q_OBJECT  
  20.   
  21. public:  
  22.     explicit MainWindow(QWidget *parent = 0);  
  23.     ~MainWindow();  
  24.   
  25. private slots:  
  26.     /** 
  27.      * @brief 打开槽函数 
  28.      */  
  29.     void onOpen();  
  30.   
  31. private:  
  32.     int m_nBuffSize; /**<  有效数据长度 */  
  33.     char* m_pBuff; /**< 数据 */  
  34.   
  35. private:  
  36.     Ui::MainWindow *ui;  
  37. };  
  38.   
  39. #endif // MAINWINDOW_H  

源文件(mainwindow.cpp):

[cpp]  view plain  copy
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3.   
  4. #include <QDataStream>  
  5. #include <QFile>  
  6. #include <QFileDialog>  
  7. #include <QImage>  
  8. #include <QMessageBox>  
  9. #include <QPixmap>  
  10.   
  11. MainWindow::MainWindow(QWidget *parent) :  
  12.     QMainWindow(parent), m_nBuffSize(0), m_pBuff(NULL),  
  13.     ui(new Ui::MainWindow)  
  14. {  
  15.     ui->setupUi(this);  
  16.     connect(ui->m_pOpen, SIGNAL(triggered()), this, SLOT(onOpen()));  
  17. }  
  18.   
  19. MainWindow::~MainWindow()  
  20. {  
  21.     if (m_pBuff != NULL)  
  22.     {  
  23.         delete m_pBuff;  
  24.         m_pBuff = NULL;  
  25.     }  
  26.     delete ui;  
  27. }  
  28.   
  29. void MainWindow::onOpen()  
  30. {  
  31.     //获取图片文件  
  32.     QString strFileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files(*.jpg *.png *.bmp)"));  
  33.     if (strFileName.isEmpty())  
  34.     {  
  35.         QMessageBox::information(NULL, tr("Warning"), tr("You didn't select any files."));  
  36.         return;  
  37.     }  
  38.   
  39.     QFile file(strFileName);  
  40.     if (!file.open(QIODevice::ReadOnly))  
  41.     {  
  42.         QMessageBox::information(NULL, tr("Warning"), tr("File open fail."));  
  43.         return;  
  44.     }  
  45.   
  46.     //先释放内存  
  47.     if (m_pBuff != NULL)  
  48.     {  
  49.         delete m_pBuff;  
  50.         m_pBuff = NULL;  
  51.     }  
  52.   
  53.     //确保内存分配成功  
  54.     int nSize = file.size();  
  55.     do  
  56.     {  
  57.         m_pBuff = new char[nSize + 1];  
  58.     }while (m_pBuff == NULL);  
  59.   
  60.     QDataStream in(&file);  
  61.     //需要的有效长度为函数返回值,并非nSize  
  62.     m_nBuffSize = in.readRawData(m_pBuff, nSize);  
  63.   
  64.     //读取失败则结束操作  
  65.     if (m_nBuffSize == -1)  
  66.     {  
  67.         return;  
  68.     }  
  69.   
  70.     //验证读取的数据,通过转化成图片显示出来  
  71.     QImage image;  
  72.     image.loadFromData(reinterpret_cast<unsigned char*>(m_pBuff), m_nBuffSize);  
  73.     ui->m_pLabel->setPixmap(QPixmap::fromImage(image));  
  74. }  

main.cpp:

[cpp]  view plain  copy
  1. #include "mainwindow.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  

显示效果图:



总结:

        要想数据获取正确,一定要确保buffSize的正确,最后显示出来的时候buffSize十分重要。一个图片也是一个文件,但buffSize并非为文件的大小。


转载地址:http://blog.csdn.net/andy_93/article/details/66472669

  • 0
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值