Qt開源作品40-圖片及文字與base64編碼互換
阿新 • • 發佈:2021-11-19
一、前言
對於圖片的傳輸,通俗的做法一般有兩種,一種是直接二進位制檔案傳輸,比如先傳輸開始標記,帶檔名稱、檔案位元組長度,然後挨個分包傳送、最後傳送檔案結束標記,這種方式必須要求接收方按照自己定義的規則來接收資料生成檔案,所以通用性有限,要麼用http的形式請求上傳檔案,按照標準的檔案上傳機制進行處理,但是這樣又限定了應用場景,比如很多時候又是需要直接底層的TCP或者UDP協議進行傳輸,或者直接傳完就顯示。
這就衍生了第二種常規做法,轉換成base64編碼進行傳輸,現有的各種語言平臺開發框架,基本上都會有base64編碼轉換的函式或者類,毫無疑問Qt也有的,作為超大型GUI開發超市,這肯定是必須的必備的基礎函式,轉換到base64編碼唯一缺點就是資料量增大不少。
還有一種常用的場景會用到base64編碼是中文的傳輸,比如用tcp協議,如果雙方都是utf8編碼都好說,關鍵是很多可能是gbk編碼的,你發過去未必認識,常見的串列埠收發中文、網路資料收發中文,都是個頭疼的問題,要相容起來最好的辦法就是直接將中文轉成base64編碼,對方接收到以後進行base64解碼,輕輕鬆鬆就搞定,我做過的公司相關的專案,還有很多第三方平臺的通訊,或者提供給第三方的介面規範,中文這塊都按照base64編碼來約定,從未出過問題。
base64編碼介紹:
- Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一。
- Base64就是一種基於64個可列印字元來表示二進位制資料的方法。
- Base64編碼是從二進位制到字元的過程,可用於在HTTP環境下傳遞較長的標識資訊。
- 採用Base64編碼具有不可讀性,需要解碼後才能閱讀。
- Base64編碼可用於在HTTP環境下傳遞較長的標識資訊。
二、主要功能
- 圖片轉base64字串。
- base64字串轉圖片。
- 字元轉base64字串。
- base64字串轉字元。
- 後期增加資料壓縮。
- Qt6對base64編碼轉換進行了重寫效率提升至少200%。
三、效果圖
四、開源主頁
以上作品完整原始碼下載都在開源主頁,會持續不斷更新作品數量和質量,歡迎各位關注。
本開源專案已經成功升級到V2.0版本,分門別類,圖文並茂,保你爽到爆。
- 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
- 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
- 個人主頁:https://qtchina.blog.csdn.net/
- 知乎主頁: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()));
}