Qt:圖片與二進位制資料的轉換
阿新 • • 發佈:2019-01-10
概述:
最近在做專案時,遇到要把圖片檔案轉換成二進位制資料,然後將資料儲存,再讀出來,最後顯示圖片,
後期的儲存和再次讀取都沒有什麼問題,最大的問題是要確保將圖片轉換成二進位制的資料正確,否則後面的操作就會出錯變得沒有意義。所以做了以下的例子。
示例:
標頭檔案(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 = newchar[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並非為檔案的大小。
轉載地址:http://blog.csdn.net/andy_93/article/details/66472669