QT编写图片数据转换工具

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


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

QT编写图片数据转换工具_第1张图片

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

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( " 恭喜你!转换完成! " ));
}
复制代码
还有不完善的地方,欢迎提出意见!

你可能感兴趣的:(图片,base64,qt)