起因
通常在qml中,Image控件的source属性赋值,都是使用“qrc:/path/../xxx.png”的方式内嵌的qt的资源系统,今天发现一种新的写法:
Image {
source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."
}
查阅资料,这种方式,是把一张图片(一般小图片)使用base64转码工具转换为一段字符串,内嵌到代码里边;
其中"data:image/png;base64,"分别指定了图片文件的MIME类型和编码格式。
什么是base64
(1)有这样一个数组,长度为64,存放64的字符,字符由大写AZ和小写az,还有数字0~9,以及'+'和'/组成;
(2)此时,有一个png图片,假设长度为3个字节(24个bit),把它按照6个bit一组,可以分为4组;
(3)6个bit能组成的最大值为64,也就说每组根据组成的值,都可以作为数组下标,在上面数组中找到一个对应的字符;
(4)如此,这个3个字节的图片数据,就转为成了4个字节的字符串,即base64的编码;
(5)不足3个字节的数据,转换后缺少的部分用‘=’补充,比如“QQ==”;
总结:简单来说,就是按照自定义的规则,对二进制数据的一种抽象解释;也可以修改规则,比如base32等;
为什么需要base64
-
ASCII能力有限
虽然每个字节,对应一个ASCII,但是有些ASCII是无法打印的控制符。
如果二进制数据流转换为ASCII后,刚好是控制符,就无法使用字符串表达二进制数据流。
如果把二进制数据流转为base64,就可以把数据流打印出来。 -
方便传递数据
在计算机的世界中一切数据都是二进制的,png、txt、pdf格式其实也是对二进制的数据一种抽象解释(本质是二进制数据),按照各自的规则定义然后把数据表达出来。
我们编码的时候,往往对数据的使用是字符串string,如果把png、txt、pdf的二进制数据进行base64转码后,就变成了字符串,方便我们在代码中使用。