QT编写图片数据转换工具

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

学习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;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");
        }
        
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;iui->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("恭喜你!转换完成!"));
}
相关文章
|
7月前
|
计算机视觉 C++
基于Qt的简易图片浏览器设计与实现
基于Qt的简易图片浏览器设计与实现
310 1
|
7月前
|
存储 容器
QT中QListWidget实现QListWidgetItem图片和文字居中
在使用QT开发软件的过程中,很多时候使用QListWidget来实现列表项的功能,比如MS系统的功能模块菜单,如下面2张图所示,其中第一张图是带文字和图标的列表项,第二张图是纯图标的模式,在最近开发的平台客户端的某个功能模块都用上了。
1068 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
191 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
91 1
|
6月前
Qt绘图(线条、椭圆、矩形、图片滚动)
Qt绘图(线条、椭圆、矩形、图片滚动)
405 3
|
6月前
|
算法 计算机视觉
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
80 0
|
7月前
|
存储 C++ 开发者
QT基础【4-简易的图片查看程序】
QT基础【4-简易的图片查看程序】
|
7月前
|
小程序
Qt实现图片可拖拉
Qt实现图片可拖拉
|
7月前
Qt鼠标悬浮在图片上显示删除字样
Qt鼠标悬浮在图片上显示删除字样
|
Linux
荔枝派Zero(全志V3S)基于QT实现在LCD显示图片
有这样一个需求,通过配置 QT,在 linux 下实现显示我所想要显示的图片,实现的方式是我可以在命令行将图片的路径作为入参传入进去,从而对其进行显示,在之前的文章中已实现了在板子上运行 QT5 程序,此需求要自己写个 QT 程序,且需要对 buildroot 进行裁剪支持一些常用的图片格式即可。
356 2