开发者最喜爱的图片编码格式:opencv编码,解码,显示base64图片
由于图片格式尺寸较大,在互联网上若想传递一张图片,往往会 把图片进行格式转换,然后进行数据传输,图片格式往往会转换为base64编码图片
base64编码图片
BASE64编码表
base64编码 是将数据用 64 个可打印的字符进行编码的方式,任何数据底层实现都是二进制,所以都可以进行 base64编码,base64编码 主要用在数据传输过程中(编码、解码)
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’。为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
支持 PNG、GIF、JPG、BMP、ICO 格式。
ASCII对照表
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’通过base64编码原理我们知道,base64的图片字符流中的每8个字符就有两个是用0补充,而且字符流的末尾还可能存在‘=’号,我们可以通过这个原理计算图片的文件流大小。
具体步骤:
按照base64编码hello单词
- 先找到每个字符对应的ASCII码,再将其转化为8位的二进制,转化如下:
- H 对应码值72,对应的二进制 01001000
- e对应码值101,对应的二进制:01100101
- l对应码值108,对应的二进制:01101100
- l对应码值108,对应的二进制:01101100
- o对应码值111,对应的二进制:01101111
- 查看字符是否是3的倍数,若不是,差一位,在后面补00000000,差2位,补00000000 00000000,这里最多差2位,不要问我为什么
- base64的码值是0-63,所以用6位的二进制就可以完全表示base64的码值(如:000000对应十进制0,111111对应的十进制为63),将上面8位一组的二进制变成6位一组的二进制
转换前:01001000 01100101 01101100 01101100 01101111 00000000
转换后:010010 000110 010101 101100 011011 000110 111100 000000
- 然后将6位一组的二进制高位补00(凑够8位)计算出十进制,再跟base64的编码表做对比,再将最后补位的0变成=,即可得到base64字符
00010010 对应十进制:18, 18对应base64字符:S
00000110 对应十进制:6, 6对应base64字符:G
00010101 对应十进制:21, 21对应base64字符:V
00101100 对应十进制:44, 44对应base64字符:s
00011011 对应十进制:27, 27对应base64字符:b
00000110 对应十进制:6, 6对应base64字符:G
00111100 对应十进制:18, 18对应base64字符:8
00000000 补位的0变成=(最后最多出现2个等号)
所以Hello对应的base64编码就是:SGVsbG8=
图片的处理过程跟字符处理类似
接受base64图片数据
BA base64_pic = img_base64 # 接受图片数据
# 处理图片
pic = base64.b64decode(base64_pic)
nparr = np.fromstring(pic, np.uint8)
img = cv2.imdecode(nparr, cv2.COLOR_BGR2RGB)
img_base64为互联网上一张经过base64编码的图片
base64.b64decode(base64_pic)拿到图片后,我们首先进行base64解码
np.fromstring使用此函数获取图片字符串的信息
cv2.imdecode 从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像
得到图片后,我们就可以使用opencv 来处理图片了,你可以使用cv.imshow()函数来查看图片
传输base64图片
待处理完成图片后,我们需要把图片再次转换为base64图片格式传输给互联网
image = cv2.imencode('.jpg', img)[1]
img = str(base64.b64encode(image))[2:-1]
cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
base64.b64encode进行图片的base64编码,进行图片的传输