找回密码
 立即注册
收起左侧

Qt开源作品40-图片及文字与base64编码互换

0
回复
134
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2021-11-19 19:53:25 显示全部楼层 |阅读模式

一、前言

对于图片的传输,通俗的做法一般有两种,一种是直接二进制文件传输,比如先传输开始标记,带文件名称、文件字节长度,然后挨个分包发送、最后发送文件结束标记,这种方式必须要求接收方按照自己定义的规则来接收数据生成文件,所以通用性有限,要么用http的形式请求上传文件,按照标准的文件上传机制进行处理,但是这样又限定了应用场景,比如很多时候又是需要直接底层的TCP或者UDP协议进行传输,或者直接传完就显示。

这就衍生了第二种常规做法,转换成base64编码进行传输,现有的各种语言平台开发框架,基本上都会有base64编码转换的函数或者类,毫无疑问Qt也有的,作为超大型GUI开发超市,这肯定是必须的必备的基础函数,转换到base64编码唯一缺点就是数据量增大不少。

还有一种常用的场景会用到base64编码是中文的传输,比如用tcp协议,如果双方都是utf8编码都好说,关键是很多可能是gbk编码的,你发过去未必认识,常见的串口收发中文、网络数据收发中文,都是个头疼的问题,要兼容起来最好的办法就是直接将中文转成base64编码,对方接收到以后进行base64解码,轻轻松松就搞定,我做过的公司相关的项目,还有很多第三方平台的通信,或者提供给第三方的接口规范,中文这块都按照base64编码来约定,从未出过问题。

base64编码介绍:

  1. Base64是网络上最常见的用于传输8Bit字节码的编码方式之一。
  2. Base64就是一种基于64个可打印字符来表示二进制数据的方法。
  3. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。
  4. 采用Base64编码具有不可读性,需要解码后才能阅读。
  5. Base64编码可用于在HTTP环境下传递较长的标识信息。

二、主要功能

  1. 图片转base64字符串。
  2. base64字符串转图片。
  3. 字符转base64字符串。
  4. base64字符串转字符。
  5. 后期增加数据压缩。
  6. Qt6对base64编码转换进行了重写效率提升至少200%。

三、效果图

四、开源主页

以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://qtchina.blog.csdn.net/
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

五、核心代码

#include "base64helper.h"
#include "qbuffer.h"
#include "qdebug.h"

QString Base64Helper::imageToBase64(const QImage &image)
{
    return QString(imageToBase64x(image));
}

QByteArray Base64Helper::imageToBase64x(const QImage &image)
{
    //这个转换可能比较耗时建议在线程中执行
    QByteArray data;
    QBuffer buffer(&data);
    image.save(&buffer, "JPG");
    data = data.toBase64();
    return data;
}

QImage Base64Helper::base64ToImage(const QString &data)
{
    return base64ToImagex(data.toUtf8());
}

QImage Base64Helper::base64ToImagex(const QByteArray &data)
{
    //这个转换可能比较耗时建议在线程中执行
    QImage image;
    image.loadFromData(QByteArray::fromBase64(data));
    return image;
}

QString Base64Helper::textToBase64(const QString &text)
{
    return QString(text.toLocal8Bit().toBase64());
}

QString Base64Helper::base64ToText(const QString &text)
{
    return QString(QByteArray::fromBase64(text.toLocal8Bit()));
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册