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