1. 程式人生 > >Qt:圖片與二進位制資料的轉換

Qt:圖片與二進位制資料的轉換

概述:

最近在做專案時,遇到要把圖片檔案轉換成二進位制資料,然後將資料儲存,再讀出來,最後顯示圖片,

後期的儲存和再次讀取都沒有什麼問題,最大的問題是要確保將圖片轉換成二進位制的資料正確,否則後面

的操作就會出錯變得沒有意義。所以做了以下的例子。

示例:

標頭檔案(mainwindow.h):

  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. #include <QMainWindow>
  11. namespace Ui {  
  12. class MainWindow;  
  13. }  
  14. class MainWindow : public QMainWindow  
  15. {  
  16.     Q_OBJECT  
  17. public:  
  18.     explicit MainWindow(QWidget *parent = 0);  
  19.     ~MainWindow();  
  20. private slots:  
  21.     /** 
  22.      * @brief 開啟槽函式 
  23.      */
  24.     void onOpen();  
  25. private:  
  26.     int m_nBuffSize; /**<  有效資料長度 */
  27.     char* m_pBuff; /**< 資料 */
  28. private:  
  29.     Ui::MainWindow *ui;  
  30. };  
  31. #endif // MAINWINDOW_H

原始檔(mainwindow.cpp):

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDataStream>
  4. #include <QFile>
  5. #include <QFileDialog>
  6. #include <QImage>
  7. #include <QMessageBox>
  8. #include <QPixmap>
  9. MainWindow::MainWindow(QWidget *parent) :  
  10.     QMainWindow(parent), m_nBuffSize(0), m_pBuff(NULL),  
  11.     ui(new Ui::MainWindow)  
  12. {  
  13.     ui->setupUi(this);  
  14.     connect(ui->m_pOpen, SIGNAL(triggered()), this, SLOT(onOpen()));  
  15. }  
  16. MainWindow::~MainWindow()  
  17. {  
  18.     if (m_pBuff != NULL)  
  19.     {  
  20.         delete m_pBuff;  
  21.         m_pBuff = NULL;  
  22.     }  
  23.     delete ui;  
  24. }  
  25. void MainWindow::onOpen()  
  26. {  
  27.     //獲取圖片檔案
  28.     QString strFileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files(*.jpg *.png *.bmp)"));  
  29.     if (strFileName.isEmpty())  
  30.     {  
  31.         QMessageBox::information(NULL, tr("Warning"), tr("You didn't select any files."));  
  32.         return;  
  33.     }  
  34.     QFile file(strFileName);  
  35.     if (!file.open(QIODevice::ReadOnly))  
  36.     {  
  37.         QMessageBox::information(NULL, tr("Warning"), tr("File open fail."));  
  38.         return;  
  39.     }  
  40.     //先釋放記憶體
  41.     if (m_pBuff != NULL)  
  42.     {  
  43.         delete m_pBuff;  
  44.         m_pBuff = NULL;  
  45.     }  
  46.     //確保記憶體分配成功
  47.     int nSize = file.size();  
  48.     do
  49.     {  
  50.         m_pBuff = newchar[nSize + 1];  
  51.     }while (m_pBuff == NULL);  
  52.     QDataStream in(&file);  
  53.     //需要的有效長度為函式返回值,並非nSize
  54.     m_nBuffSize = in.readRawData(m_pBuff, nSize);  
  55.     //讀取失敗則結束操作
  56.     if (m_nBuffSize == -1)  
  57.     {  
  58.         return;  
  59.     }  
  60.     //驗證讀取的資料,通過轉化成圖片顯示出來
  61.     QImage image;  
  62.     image.loadFromData(reinterpret_cast<unsigned char*>(m_pBuff), m_nBuffSize);  
  63.     ui->m_pLabel->setPixmap(QPixmap::fromImage(image));  
  64. }  

main.cpp:

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

顯示效果圖:



總結:

        要想資料獲取正確,一定要確保buffSize的正確,最後顯示出來的時候buffSize十分重要。一個圖片也是一個檔案,但buffSize並非為檔案的大小。

轉載地址:http://blog.csdn.net/andy_93/article/details/66472669