202 lines
5.4 KiB
C++
202 lines
5.4 KiB
C++
#pragma once
|
||
#include <opencv2/opencv.hpp>
|
||
#include <iostream>
|
||
#include <string>
|
||
|
||
/*
|
||
static std::string base64Decode(const char* Data, int DataByte) {
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>
|
||
const char DecodeTable[] =
|
||
{
|
||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
62, // '+'
|
||
0, 0, 0,
|
||
63, // '/'
|
||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
|
||
0, 0, 0, 0, 0, 0, 0,
|
||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
|
||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
|
||
0, 0, 0, 0, 0, 0,
|
||
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
|
||
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
|
||
};
|
||
std::string strDecode;
|
||
int nValue;
|
||
int i = 0;
|
||
while (i < DataByte) {
|
||
if (*Data != '\r' && *Data != '\n') {
|
||
nValue = DecodeTable[*Data++] << 18;
|
||
nValue += DecodeTable[*Data++] << 12;
|
||
strDecode += (nValue & 0x00FF0000) >> 16;
|
||
if (*Data != '=') {
|
||
nValue += DecodeTable[*Data++] << 6;
|
||
strDecode += (nValue & 0x0000FF00) >> 8;
|
||
if (*Data != '=') {
|
||
nValue += DecodeTable[*Data++];
|
||
strDecode += nValue & 0x000000FF;
|
||
}
|
||
}
|
||
i += 4;
|
||
}
|
||
else {
|
||
Data++;
|
||
i++;
|
||
}
|
||
}
|
||
return strDecode;
|
||
}
|
||
|
||
|
||
static std::string base64Encode(const unsigned char* Data, int DataByte) {
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>
|
||
const char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
//<2F><><EFBFBD><EFBFBD>ֵ
|
||
std::string strEncode;
|
||
unsigned char Tmp[4] = { 0 };
|
||
int LineLength = 0;
|
||
for (int i = 0; i < (int)(DataByte / 3); i++) {
|
||
Tmp[1] = *Data++;
|
||
Tmp[2] = *Data++;
|
||
Tmp[3] = *Data++;
|
||
strEncode += EncodeTable[Tmp[1] >> 2];
|
||
strEncode += EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
|
||
strEncode += EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
|
||
strEncode += EncodeTable[Tmp[3] & 0x3F];
|
||
if (LineLength += 4, LineLength == 76) { strEncode += "\r\n"; LineLength = 0; }
|
||
}
|
||
//<2F><>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>б<EFBFBD><D0B1><EFBFBD>
|
||
int Mod = DataByte % 3;
|
||
if (Mod == 1) {
|
||
Tmp[1] = *Data++;
|
||
strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];
|
||
strEncode += EncodeTable[((Tmp[1] & 0x03) << 4)];
|
||
strEncode += "==";
|
||
}
|
||
else if (Mod == 2) {
|
||
Tmp[1] = *Data++;
|
||
Tmp[2] = *Data++;
|
||
strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];
|
||
strEncode += EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
|
||
strEncode += EncodeTable[((Tmp[2] & 0x0F) << 2)];
|
||
strEncode += "=";
|
||
}
|
||
|
||
|
||
return strEncode;
|
||
}
|
||
*/
|
||
|
||
static const std::string base64_chars =
|
||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||
"abcdefghijklmnopqrstuvwxyz"
|
||
"0123456789+/";
|
||
|
||
|
||
static inline bool is_base64(unsigned char c) {
|
||
return (isalnum(c) || (c == '+') || (c == '/'));
|
||
}
|
||
|
||
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
|
||
std::string ret;
|
||
int i = 0;
|
||
int j = 0;
|
||
unsigned char char_array_3[3];
|
||
unsigned char char_array_4[4];
|
||
|
||
while (in_len--) {
|
||
char_array_3[i++] = *(bytes_to_encode++);
|
||
if (i == 3) {
|
||
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||
char_array_4[3] = char_array_3[2] & 0x3f;
|
||
|
||
for (i = 0; (i <4); i++)
|
||
ret += base64_chars[char_array_4[i]];
|
||
i = 0;
|
||
}
|
||
}
|
||
|
||
if (i)
|
||
{
|
||
for (j = i; j < 3; j++)
|
||
char_array_3[j] = '\0';
|
||
|
||
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||
|
||
for (j = 0; (j < i + 1); j++)
|
||
ret += base64_chars[char_array_4[j]];
|
||
|
||
while ((i++ < 3))
|
||
ret += '=';
|
||
|
||
}
|
||
|
||
return ret;
|
||
|
||
}
|
||
|
||
std::string base64_decode(std::string const& encoded_string) {
|
||
int in_len = encoded_string.size();
|
||
int i = 0;
|
||
int j = 0;
|
||
int in_ = 0;
|
||
unsigned char char_array_4[4], char_array_3[3];
|
||
std::string ret;
|
||
|
||
while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
|
||
char_array_4[i++] = encoded_string[in_]; in_++;
|
||
if (i == 4) {
|
||
for (i = 0; i <4; i++)
|
||
char_array_4[i] = base64_chars.find(char_array_4[i]);
|
||
|
||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||
|
||
for (i = 0; (i < 3); i++)
|
||
ret += char_array_3[i];
|
||
i = 0;
|
||
}
|
||
}
|
||
|
||
if (i) {
|
||
for (j = 0; j < i; j++)
|
||
char_array_4[j] = base64_chars.find(char_array_4[j]);
|
||
|
||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||
|
||
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
static std::string Mat2Base64(const cv::Mat &img, std::string imgType) {
|
||
//Matתbase64
|
||
std::string img_data;
|
||
std::vector<uchar> vecImg;
|
||
std::vector<int> vecCompression_params;
|
||
vecCompression_params.push_back(/*CV_IMWRITE_JPEG_QUALITY*/1);
|
||
vecCompression_params.push_back(80);
|
||
imgType = "." + imgType;
|
||
cv::imencode(imgType, img, vecImg, vecCompression_params);
|
||
img_data = base64_encode(vecImg.data(), vecImg.size());
|
||
return img_data;
|
||
}
|
||
|
||
|
||
static cv::Mat Base2Mat(std::string &base64_data) {
|
||
cv::Mat img;
|
||
std::string s_mat;
|
||
s_mat = base64_decode(base64_data);
|
||
std::vector<char> base64_img(s_mat.begin(), s_mat.end());
|
||
|
||
img = cv::imdecode(base64_img, cv::IMREAD_COLOR);
|
||
return img;
|
||
}
|