Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。
Base的索引表
Base64的索引表,字符选用了”A-Z、a-z、0-9、+、/” 64个可打印字符。数值代表字符的索引,这个是标准Base64编码规定的,如下图:
Base64的原理
Base64的码表只有64个字符, 如果要表达64个字符的话,使用6的bit即可完全表示(2的6次方为64)。
因为Base64的编码只有6个bit即可表示,而正常的字符是使用8个bit表示, 8和6的最小公倍数是24,所以4个Base64字符可以表示3个标准的ascll字符;
如果是字符串转换为Base64码, 会先把对应的字符串转换为ascll码表对应的数字, 然后再把数字转换为2进制。
图片转化为base64
图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址。
意义:网页上的每一个图片,都是需要消耗一个 http 请求下载而来的(所有才有了 csssprites 技术的应运而生,但是 csssprites 有自身的局限性)。
图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,base64可以随着 HTML 的下载同时下载到本地.减少https请求。
优点
- base64格式的图片是文本格式,占用内存小,转换后的大小比例大概为1/3,降低了资源服务器的消耗;
- 网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。
缺点
- base64格式的文本内容较多,存储在数据库中增大了数据库服务器的压力;
- 网页加载图片虽然不用访问服务器了,但因为base64格式的内容太多,所以加载网页的速度会降低,可能会影响用户的体验。
- base64无法缓存,要缓存只能缓存包含base64的文件,比如js或者css,这比直接缓存图片要差很多,而且一般HTML改动比较频繁,所以等同于得不到缓存效益。
调用方式
#divare-aa, #divare-bb{
background: url(data:image/gif;base64,图片的base64字符串) no-repeat center;
}/*css样式表使用*/
<!--img标签调用-->
<img src="data:image/gif;base64,图片的base64字符串">
因为base64的使用缺点,所以一般图片小于10kb的时候,我们才会选择使用base64图片,比如一些表情图片,太大的图片转换成base64得不偿失。当然,极端情况极端考虑。
C#代码实现图片转Base64
private string ImageConvertBase64StringForJs(Image img,ImageFormat imageFormat=null)
{
if (img == null)
{
return "";
}
imageFormat = img.RawFormat ?? imageFormat??ImageFormat.Jpeg;
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, img.RawFormat?? ImageFormat.Jpeg);
byte[] data = ms.ToArray();
return Convert.ToBase64String(data);
}
}
private Image Base64StringConvertImageForJs(string base64)
{
if (string.IsNullOrEmpty(base64))
{
throw new ArgumentNullException("base64参数不能为空");
}
byte[] bytes = Convert.FromBase64String(base64);
Image img = null;
using (MemoryStream memStream = new MemoryStream(bytes))
{
img = Image.FromStream(memStream);
}
return img;
}
转载请注明:清风亦平凡 » C#实现图片转Base64编码