1. 程式人生 > 其它 >Qt開源作品40-圖片及文字與base64編碼互換

Qt開源作品40-圖片及文字與base64編碼互換

一、前言

對於圖片的傳輸,通俗的做法一般有兩種,一種是直接二進位制檔案傳輸,比如先傳輸開始標記,帶檔名稱、檔案位元組長度,然後挨個分包傳送、最後傳送檔案結束標記,這種方式必須要求接收方按照自己定義的規則來接收資料生成檔案,所以通用性有限,要麼用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()));
}