天天看點

QT編寫圖檔資料轉換工具

學習QT已經一個月了,覺得QT真是個好東西,他的這種跨平台機制簡直太棒了!還有QML這東西,真牛B!在這段學習期間,因為一個項目的需要,需要将圖檔轉成資料,然後傳出去,那邊接收到資料後再對應轉換成圖檔,才有了下面這個小工具,開發環境:QT 4.7.0,在LINUX下面重新編譯也可以在LINUX下面運作,代碼不用改!先放張截圖吧。

QT編寫圖檔資料轉換工具

本人比較懶,還是貼出代碼來吧!其中主要就是兩個函數。

void picToData(QString fromPic,QString toData,QString myformat);

void dataToPic(QString fromData,QString toPic,QString myformat); 外加幾個輔助處理函數:QString getFileName(QString filter);//擷取打開對話框中指定格式的檔案QStringList getFileNames(QString filter);//擷取打開對話框中指定格式的檔案清單void delayTime(int s); frmmain.h代碼:

#ifndef FRMMAIN_H

#define FRMMAIN_H

#include QWidget>

#include QtGui>

#include QDrag>

namespace Ui {

    class frmmain;

}

class frmmain : public QWidget

{

    Q_OBJECT

public:

    explicit frmmain(QWidget *parent = 0);

    ~frmmain();

private:

    Ui::frmmain *ui;

private slots:

    void on_btnChangeToJpg_clicked();

    void on_btnChangeToTxt_clicked();

    void on_btnSelectTxt_clicked();

    void on_btnSelectFile_clicked();

    void on_btnDataToPic_clicked();

    void on_btnPicToData_clicked();

    void on_btn2_clicked();

    void on_btn1_clicked();

    void picToData(QString fromPic,QString toData,QString myformat);

    void dataToPic(QString fromData,QString toPic,QString myformat);

    QString getFileName(QString filter);//擷取打開對話框中指定格式的檔案

    QStringList getFileNames(QString filter);//擷取打開對話框中指定格式的檔案清單

    void delayTime(int s);

};

#endif // FRMMAIN_H

frmmain.cpp代碼:

#include "frmmain.h"

#include "ui_frmmain.h"

frmmain::frmmain(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::frmmain)

    ui->setupUi(this);

frmmain::~frmmain()

    delete ui;

//圖檔轉資料

void frmmain::picToData(QString fromPic, QString toData, QString myformat)

    QImage img(fromPic);

    QByteArray ba;

    QBuffer buf(&ba);

    img.save(&buf,"JPG");//按照JPG解碼儲存資料

    QByteArray cc=qCompress(ba,1);

    QByteArray hh;

    if (myformat=="Hex")

    {

        hh=cc.toHex();//16進制資料

    }

    else

        hh=cc.toBase64();//base64資料

    QString str(hh);

    QFile file(toData);

    if (file.open(QFile::WriteOnly))

        file.write(str.toLatin1());

        file.close();

//資料轉圖檔

void frmmain::dataToPic(QString fromData, QString toPic, QString myformat)

    QFile file(fromData);

    if (file.open(QFile::ReadOnly))

        QByteArray read=file.readAll();

        QString ss=QString::fromLatin1(read.data(),read.size());

        QByteArray rc;

        if (myformat=="Hex")

        {

            rc=QByteArray::fromHex(ss.toAscii());

        }

        else

            rc=QByteArray::fromBase64(ss.toAscii());

        QByteArray rdc=qUncompress(rc);

        QImage img;

        img.loadFromData(rdc);

        img.save(toPic);

QString frmmain::getFileName(QString filter)

    QString fileName;

    fileName=QFileDialog::getOpenFileName(this,tr("選擇檔案"),QCoreApplication::applicationDirPath(),filter);

    if (!fileName.isEmpty())

        return fileName;

        return "";

QStringList frmmain::getFileNames(QString filter)

    QStringList fileNames;

    fileNames=QFileDialog::getOpenFileNames(this,tr("選擇檔案"),QCoreApplication::applicationDirPath(),filter);

    if (!fileNames.isEmpty())

        return fileNames;

void frmmain::on_btn1_clicked()

    ui->pic->setText(this->getFileName(tr("圖檔檔案(*.jpg)")));

void frmmain::on_btn2_clicked()

    ui->txt->setText(this->getFileName(tr("文本檔案(*.txt)")));

void frmmain::on_btnPicToData_clicked()

    if (ui->pic->text()=="")

        QMessageBox::information(this,tr("提示"),tr("請選擇圖檔檔案"));

        return;

    if (ui->txt->text()=="")

        QMessageBox::information(this,tr("提示"),tr("請選擇文本檔案"));

    if (ui->rbtn16->isChecked())

        this->picToData(ui->pic->text(),ui->txt->text(),"Hex");

        this->picToData(ui->pic->text(),ui->txt->text(),"Base64");

void frmmain::on_btnDataToPic_clicked()

        this->dataToPic(ui->txt->text(),ui->pic->text(),"Hex");

        this->dataToPic(ui->txt->text(),ui->pic->text(),"Base64");

void frmmain::on_btnSelectFile_clicked()

    ui->listWidget->addItems(this->getFileNames(tr("圖檔檔案(*.jpg)")));

void frmmain::delayTime(int s)

    QTime t=QTime::currentTime().addMSecs(s);

    while(QTime::currentTime()t)

        QCoreApplication::processEvents(QEventLoop::AllEvents,100);

void frmmain::on_btnSelectTxt_clicked()

    ui->listWidget->addItems(this->getFileNames(tr("文本檔案(*.txt)")));

void frmmain::on_btnChangeToTxt_clicked()

    QListWidgetItem *myitem;

    if (ui->listWidget->count()==0)

    for (int i=0;iui->listWidget->count();i++)

        QString timeNow=QTime::currentTime().toString("hhmmss");

        QString dateNow=QDate::currentDate().toString("yyyyMMdd");

        QString saveFileName=QCoreApplication::applicationDirPath()+tr("/imagedata/%1%2.txt").arg(dateNow,timeNow);

        myitem=ui->listWidget->item(i);

        if (ui->rbtn16->isChecked())

            this->picToData(myitem->text(),saveFileName,"Hex");

            this->picToData(myitem->text(),saveFileName,"Base64");

        this->delayTime(1000);//為了確定命名不沖突和轉換完成,延時1秒

    QMessageBox::information(this,tr("提示"),tr("恭喜你!轉換完成!"));

void frmmain::on_btnChangeToJpg_clicked()

        QString saveFileName=QCoreApplication::applicationDirPath()+tr("/imageto/%1%2.jpg").arg(dateNow,timeNow);

            this->dataToPic(myitem->text(),saveFileName,"Hex");

            this->dataToPic(myitem->text(),saveFileName,"Base64");

繼續閱讀