1.目的:
在串行,或者网络通信的时候,往往需要把图片解析成16进制的数据,方便数据的传输。而在另一端接收到数据后,在将接收到的数据显示成图片。
2:代码:
#include"mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QDir>
#include<QDebug>
#include<QBuffer>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString filename;
//获取图片的路径,和名字
filename=QFileDialog::getOpenFileName(this,tr("选择图片"),QDir::currentPath());
QImage img(filename);
QByteArray ba;
QBuffer buf(&ba);
buf.open(QIODevice::WriteOnly);
//按照PNG解码保存数据,具体看Qt文档,有解释
img.save(&buf,"PNG");
//因为文本输入的格式为str
QString str;
str.append(ba.toHex);
ui->textEdit->setText(str);
//点击曹函数,将文本中的数据转换成图片
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(open()));
}
/***************************************************************************************
因为是从接收到的数据,转换成图片,不是在本地去打开一个图片去显示,所以有些函数是不行的;
比如:
bool | loadFromData(const QByteArray & data, const char * format = 0) |
bool | load(const QString & fileName, const char * format = 0) |
这两个函数虽然可以打开图片,但是好像只支持在本地打开,他们加载的是这个图片所在目录下的节点
或者是文件描述符。而不是真正的数据。所以用这个函数:
bool | loadFromData(const uchar * data, int len, const char * format = 0) |
将16进制的数据转换成uchar的格式;
****************************************************************************************/
void MainWindow::open(){
//从文本中获取数据,16进制的字符串。
QString str_temp=ui->textEdit->toPlainText();
//将16进制的字符串转换成uchar的类型。
uchar date[str_temp.size()/2]={0};
bool ok;
int i=0;
while(i<num)
{
date[i]=str_temp.mid(i*2,2).toInt(&ok,16);
i++;
}
//将数据加载,转成图片显示
QPixmap pix;
if(pix.loadFromData(date,num))
{
ui->label->setPixmap(pix);
}
else {
QMessageBox::about(this,tr("失败 "),"1111111");
return ;
}
}
MainWindow::~MainWindow()
{
delete ui;
}