热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于opencv对图片进行base64格式的编解码

首先base64,了解一下:Base64就是一种基于64个可打印字符来表示二进制数据的方法。表示二进制数,所以我得先让图片转化为二进制数据

首先base64,了解一下:Base64就是一种基于64个可打印字符来表示二进制数据的方法。
表示二进制数,所以我得先让图片转化为二进制数据,然后对二进制数据进行base64编码;
或者先对base64字符串进行解码,然后再把二进制数据转化为图片保存或展示。

流程


  • 编码
    1. cv::Mat图片 -> 二进制数据

bool imencode(const string& ext, InputArray img, vector& buf, const vector& params=vector())
//ext: 图片后缀名,如".jpg"或".png"
//img: 需要进行相关操作的图片
//buf: 输出二进制数据到该缓存。//params:格式相关的参数
//params中的每个参数成对出现,即paramId_1, paramValue_1, paramId_2, paramValue_2, … ,当前支持如下参数:
//JPEG:压缩质量 ( CV_IMWRITE_JPEG_QUALITY ),从0到100(数值越高质量越好),默认值为95。
//PNG: compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
//PPM, PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。

2.二进制数据 -> base64字符串
网上有很多的 base64编解码 源码,本文末会添加我使用的源码供参考。


附:

/*****test.cpp*****/
#include
#include
#include
#include
#include "base64.h"
using namespace cv;
using namespace std;
void write(string encode_str);
string read(string fileName);
string encode();
Mat decode();int main() { Mat img = decode();imshow("test", img);if (waitKey(1) == 27)return 0;system("pause");return 0;
}/***编码得到的 base64字符串 写入 “base64_str” 保存***/
void write(string encode_str)
{ofstream out;out.open("base64_str", ios::out | ios::trunc);out <}/***读取指定文件保存的 base64 字符串并返回***/
string read(string fileName)
{string base64_str;ifstream in;in.open(fileName, ios::in);in >> base64_str;cout <<"base64_str.length() &#61; " <return base64_str;
}/***编码***/
string encode()
{string img_path("img.jpg");Mat img;img &#61; imread(img_path);if (img.empty()){cout <<"img is empty" <return "Failed";}vector img_data;imencode(".jpg", img, img_data);string str_Encode(img_data.begin(), img_data.end());write(str_Encode);
}/***解码***/
Mat decode()
{string encode_str &#61; read("dog.base");string decode_str;//这里可以看到&#xff0c;我调用的第三方库支持std::string类的参数形式Base64::Decode(encode_str, &decode_str);vector img_data(decode_str.begin(), decode_str.end());Mat img &#61; imdecode(Mat(img_data), CV_LOAD_IMAGE_COLOR);return img;
}


关于base64解码&#xff0c;碰到一个问题&#xff1a;
借助在线编码器&#xff0c;将以下图片&#xff1a;
这里写图片描述
转为base64字符串&#xff1a;
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGB。。。。。。。。。
如果需要解析字符串&#xff0c;加粗部分需要删除&#xff0c;在未删除时&#xff0c;执行程序提示&#xff1a;
这里写图片描述
删除后&#xff0c;运行正常&#xff1a;
这里写图片描述


刚刚发现csdn下载如果上传资源不能免费 0.0

/*****base64.h*****/
#ifndef BASE64_H
#define BASE64_H#include const char kBase64Alphabet[] &#61; "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789&#43;/";class Base64 {
public:static bool Encode(const std::string &in, std::string *out) {int i &#61; 0, j &#61; 0;size_t enc_len &#61; 0;unsigned char a3[3];unsigned char a4[4];out->resize(EncodedLength(in));int input_len &#61; in.size();std::string::const_iterator input &#61; in.begin();while (input_len--) {a3[i&#43;&#43;] &#61; *(input&#43;&#43;);if (i &#61;&#61; 3) {a3_to_a4(a4, a3);for (i &#61; 0; i <4; i&#43;&#43;) {(*out)[enc_len&#43;&#43;] &#61; kBase64Alphabet[a4[i]];}i &#61; 0;}}if (i) {for (j &#61; i; j <3; j&#43;&#43;) {a3[j] &#61; &#39;\0&#39;;}a3_to_a4(a4, a3);for (j &#61; 0; j 1; j&#43;&#43;) {(*out)[enc_len&#43;&#43;] &#61; kBase64Alphabet[a4[j]];}while ((i&#43;&#43; <3)) {(*out)[enc_len&#43;&#43;] &#61; &#39;&#61;&#39;;}}return (enc_len &#61;&#61; out->size());}static bool Encode(const char *input, size_t input_length, char *out, size_t out_length) {int i &#61; 0, j &#61; 0;char *out_begin &#61; out;unsigned char a3[3];unsigned char a4[4];size_t encoded_length &#61; EncodedLength(input_length);if (out_length return false;while (input_length--) {a3[i&#43;&#43;] &#61; *input&#43;&#43;;if (i &#61;&#61; 3) {a3_to_a4(a4, a3);for (i &#61; 0; i <4; i&#43;&#43;) {*out&#43;&#43; &#61; kBase64Alphabet[a4[i]];}i &#61; 0;}}if (i) {for (j &#61; i; j <3; j&#43;&#43;) {a3[j] &#61; &#39;\0&#39;;}a3_to_a4(a4, a3);for (j &#61; 0; j 1; j&#43;&#43;) {*out&#43;&#43; &#61; kBase64Alphabet[a4[j]];}while ((i&#43;&#43; <3)) {*out&#43;&#43; &#61; &#39;&#61;&#39;;}}return (out &#61;&#61; (out_begin &#43; encoded_length));}static bool Decode(const std::string &in, std::string *out) {int i &#61; 0, j &#61; 0;size_t dec_len &#61; 0;unsigned char a3[3];unsigned char a4[4];int input_len &#61; in.size();std::string::const_iterator input &#61; in.begin();out->resize(DecodedLength(in));while (input_len--) {if (*input &#61;&#61; &#39;&#61;&#39;) {break;}a4[i&#43;&#43;] &#61; *(input&#43;&#43;);if (i &#61;&#61; 4) {for (i &#61; 0; i <4; i&#43;&#43;) {a4[i] &#61; b64_lookup(a4[i]);}a4_to_a3(a3, a4);for (i &#61; 0; i <3; i&#43;&#43;) {(*out)[dec_len&#43;&#43;] &#61; a3[i];}i &#61; 0;}}if (i) {for (j &#61; i; j <4; j&#43;&#43;) {a4[j] &#61; &#39;\0&#39;;}for (j &#61; 0; j <4; j&#43;&#43;) {a4[j] &#61; b64_lookup(a4[j]);}a4_to_a3(a3, a4);for (j &#61; 0; j 1; j&#43;&#43;) {(*out)[dec_len&#43;&#43;] &#61; a3[j];}}return (dec_len &#61;&#61; out->size());}static bool Decode(const char *input, size_t input_length, char *out, size_t out_length) {int i &#61; 0, j &#61; 0;char *out_begin &#61; out;unsigned char a3[3];unsigned char a4[4];size_t decoded_length &#61; DecodedLength(input, input_length);if (out_length return false;while (input_length--) {if (*input &#61;&#61; &#39;&#61;&#39;) {break;}a4[i&#43;&#43;] &#61; *(input&#43;&#43;);if (i &#61;&#61; 4) {for (i &#61; 0; i <4; i&#43;&#43;) {a4[i] &#61; b64_lookup(a4[i]);}a4_to_a3(a3, a4);for (i &#61; 0; i <3; i&#43;&#43;) {*out&#43;&#43; &#61; a3[i];}i &#61; 0;}}if (i) {for (j &#61; i; j <4; j&#43;&#43;) {a4[j] &#61; &#39;\0&#39;;}for (j &#61; 0; j <4; j&#43;&#43;) {a4[j] &#61; b64_lookup(a4[j]);}a4_to_a3(a3, a4);for (j &#61; 0; j 1; j&#43;&#43;) {*out&#43;&#43; &#61; a3[j];}}return (out &#61;&#61; (out_begin &#43; decoded_length));}static int DecodedLength(const char *in, size_t in_length) {int numEq &#61; 0;const char *in_end &#61; in &#43; in_length;while (*--in_end &#61;&#61; &#39;&#61;&#39;) &#43;&#43;numEq;return ((6 * in_length) / 8) - numEq;}static int DecodedLength(const std::string &in) {int numEq &#61; 0;int n &#61; in.size();for (std::string::const_reverse_iterator it &#61; in.rbegin(); *it &#61;&#61; &#39;&#61;&#39;; &#43;&#43;it) {&#43;&#43;numEq;}return ((6 * n) / 8) - numEq;}inline static int EncodedLength(size_t length) {return (length &#43; 2 - ((length &#43; 2) % 3)) / 3 * 4;}inline static int EncodedLength(const std::string &in) {return EncodedLength(in.length());}inline static void StripPadding(std::string *in) {while (!in->empty() && *(in->rbegin()) &#61;&#61; &#39;&#61;&#39;) in->resize(in->size() - 1);}private:static inline void a3_to_a4(unsigned char * a4, unsigned char * a3) {a4[0] &#61; (a3[0] & 0xfc) >> 2;a4[1] &#61; ((a3[0] & 0x03) <<4) &#43; ((a3[1] & 0xf0) >> 4);a4[2] &#61; ((a3[1] & 0x0f) <<2) &#43; ((a3[2] & 0xc0) >> 6);a4[3] &#61; (a3[2] & 0x3f);}static inline void a4_to_a3(unsigned char * a3, unsigned char * a4) {a3[0] &#61; (a4[0] <<2) &#43; ((a4[1] & 0x30) >> 4);a3[1] &#61; ((a4[1] & 0xf) <<4) &#43; ((a4[2] & 0x3c) >> 2);a3[2] &#61; ((a4[2] & 0x3) <<6) &#43; a4[3];}static inline unsigned char b64_lookup(unsigned char c) {if (c >&#61; &#39;A&#39; && c <&#61; &#39;Z&#39;) return c - &#39;A&#39;;if (c >&#61; &#39;a&#39; && c <&#61; &#39;z&#39;) return c - 71;if (c >&#61; &#39;0&#39; && c <&#61; &#39;9&#39;) return c &#43; 4;if (c &#61;&#61; &#39;&#43;&#39;) return 62;if (c &#61;&#61; &#39;/&#39;) return 63;return 255;}
};#endif // BASE64_H

参考:OpenCV学习笔记&#xff08;一&#xff09;&#xff1a;读取、显示、保存图片


推荐阅读
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • 上次我们总结了React代码构建后的webpack模块组织关系,今天来介绍一下Babel编译JSX生成目标代码的一些规则,并且写一个简单的解析器,模拟整个生成的过程。我们还是拿最简 ... [详细]
  • [USACO 2006 November Gold] 玉米地Corn Fields
    题目描述  FarmerJohn新买了一块长方形的牧场,这块牧场被划分成M行N列(1<M<12;1<N<12),每一格都是一块正方形的土地。FJ打 ... [详细]
  • 3357: [Usaco2004]等差数列
    3357:[Usaco2004]等差数列TimeLimit:10SecMemoryLimit:128MBSubmit:321Solved:153[Submit][Status][D ... [详细]
  • 九宫格计算. ... [详细]
  •   uni-app开发教程,uni-app实例教程  UNI-APP开发(仿饿)开发课程:进入学习  推荐(免费):uni-app开发教程  文章目录  简介,网 ... [详细]
  • 元类print(type(abc))print(type(True))print(type(100))print(type([1,2,3]))print(type({na ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • 1,启动MySQL终端输入mysql-uroot-p然后输入密码,启动成功WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMyS ... [详细]
  • iic协议
    IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S ... [详细]
  • C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t ... [详细]
  • 技术点:1、通过已知的网页路径获得流2、把流转换成字节数组3、把字节数组转换成String字符串显示在TextView控件中一、获得流publicstaticSt ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了opencv类简单分析:Point相关的知识,希望对你有一定的参考价值。定义 ... [详细]
  • Spring容器获取Bean和创建Bean都会调用getBean()方法getBean()--doGetBean()1.transformedBeanName(name);获取b ... [详细]
  • apk简单介绍APK的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程 ... [详细]
author-avatar
Kathy-辜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有