QT编写图片数据转换工具

来源:互联网 发布:原田知世 身高 编辑:程序博客网 时间:2024/04/28 15:45

http://www.cnblogs.com/feiyangqingyun/archive/2011/01/25/1944500.html


学习QT已经一个月了,觉得QT真是个好东西,他的这种跨平台机制简直太棒了!还有QML这东西,真牛B!在这段学习期间,因为一个项目的需要,需要将图片转成数据,然后传出去,那边接收到数据后再对应转换成图片,才有了下面这个小工具,开发环境:QT 4.7.0,在LINUX下面重新编译也可以在LINUX下面运行,代码不用改!先放张截图吧。

本人比较懒,还是贴出代码来吧!其中主要就是两个函数。

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();
        file.close();
        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;
    }
    
else
    {
        
return "";
    }
}

QStringList frmmain::getFileNames(QString filter)
{
    QStringList fileNames;
    fileNames
=QFileDialog::getOpenFileNames(this,tr("选择文件"),QCoreApplication::applicationDirPath(),filter);
    
if (!fileNames.isEmpty())
    {
        
return fileNames;
    }
    
else
    {
        
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("请选择文本文件"));
        
return;
    }
    
if (ui->rbtn16->isChecked())
    {
        
this->picToData(ui->pic->text(),ui->txt->text(),"Hex");
    }
    
else
    {
        
this->picToData(ui->pic->text(),ui->txt->text(),"Base64");
    }
}

void frmmain::on_btnDataToPic_clicked()
{
    
if (ui->pic->text()=="")
    {
        QMessageBox::information(
this,tr("提示"),tr("请选择图片文件"));
        
return;
    }
    
if (ui->txt->text()=="")
    {
        QMessageBox::information(
this,tr("提示"),tr("请选择文本文件"));
        
return;
    }
    
if (ui->rbtn16->isChecked())
    {
        
this->dataToPic(ui->txt->text(),ui->pic->text(),"Hex");
    }
    
else
    {
        
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)
    {
        
return;
    }

    
for (int i=0;i<ui->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");
        }
        
else
        {
            
this->picToData(myitem->text(),saveFileName,"Base64");
        }
        
this->delayTime(1000);//为了确保命名不冲突和转换完成,延时1秒
    }
    QMessageBox::information(
this,tr("提示"),tr("恭喜你!转换完成!"));
}

void frmmain::on_btnChangeToJpg_clicked()
{
    QListWidgetItem 
*myitem;
    
if (ui->listWidget->count()==0)
    {
        
return;
    }

    
for (int i=0;i<ui->listWidget->count();i++)
    {
        QString timeNow
=QTime::currentTime().toString("hhmmss");
        QString dateNow
=QDate::currentDate().toString("yyyyMMdd");
        QString saveFileName
=QCoreApplication::applicationDirPath()+tr("/imageto/%1%2.jpg").arg(dateNow,timeNow);
        myitem
=ui->listWidget->item(i);
        
if (ui->rbtn16->isChecked())
        {
            
this->dataToPic(myitem->text(),saveFileName,"Hex");
        }
        
else
        {
            
this->dataToPic(myitem->text(),saveFileName,"Base64");
        }
        
this->delayTime(1000);//为了确保命名不冲突和转换完成,延时1秒
    }
    QMessageBox::information(
this,tr("提示"),tr("恭喜你!转换完成!"));
}
复制代码
还有不完善的地方,欢迎提出意见!

0 0
原创粉丝点击