一、base64百科
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。
某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什么?
好吧,我也不喜欢专业术语的解释。你只要知道,base64编码就是长得像下面这样子的代码:
thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
上面代码大家都熟悉吧,迅雷下载链接哦(咳咳,该地址很纯洁),就是base64编码后的地址,所以以后看到这种:一堆连续字母,最后有1~2个“=”的代码就是base64。
base64:URL就是URL地址是base64编码的。
例如下面这个:
<img src="data:image/gif;base64,R0lGODlhAwADAIABAL6+vv///yH5BAEAAAEALAAAAAADAAMAAAIDjA9WADs=" />
二、base64与文件数据编码
在网络中,通过HTTP传输的文件还可以通过base64对数据进行编码进行传输。就如上面的这个base64的gif格式图片。当然,可以base64编码的文件不仅仅是图片,也可以是字体文件,例如(中间有缺省):
@font-face{
font-family: forTest;
src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAh4 ... RFERuENEGADl7JlY=) format('woff');
}
自然,对于background-image图片,我们也可以使用base64编码进行传输,例如:
background-image:url(data:image/gif;base64,R0lGODlhBAABAIABAMLBwfLx8SH5BAEAAAEALAAAAAAEAAEAAAICRF4AOw==);
而使用base64编码作为background-image图片就是本文要着重阐述的。
三、如何获得图片的base64编码
其实在我之前“基于HTML5的可预览多图片Ajax上传”以及“zSlide-基于CSS3/HTML5演示文档jQuery插件”实际上就与图片的base64编码的获取打过交道了。如下本地图片转换成可预览的base64编码的核心脚本:
var reader = new FileReader(), htmlImage;
reader.onload = function(e) {
htmlImage = '<img src="'+ e.target.result +'" />'; // 这里e.target.result就是base64编码
}
reader.readAsDataURL(file);
上面说的你只需要了解,实际上,目前base64编码工具不少,对于我们前端制作,下面这个本地图片 base64编码获取页面是值得推荐的:Encode Data URL By PuterJam
直接将桌面图片拖到条条里就有了响应的background-image url属性可用的base64地址了:
该转换页面的原理就是上面所说的HTML5 文件本地预览原理,具体可以自己查阅资料。
四、使用base64:URL的优缺点
个人觉得base64:URL传输图片文件的好处在于:
1.减少了HTTP请求
2.某些文件可以避免跨域的问题
3.没有图片更新要重新上传,还要清理缓存的问题
不足在于:
1.浏览器支持
使用base64编码图片作为背景图片的这种技术IE6/IE7浏览器是不支持的(IE9浏览器IE7模式下支持,这里被@前端的那点破事鄙视了 )。对于目前PC页面,兼容性问题使没有文件上传以及无需更新缓存的优点不存在了。
2.增加了CSS文件的尺寸
base64编码图片本质上是将图片的二进制大小以一些字母的形式展示,例如一个1024字节的图片,base64编码后至少1024个字符,这个大小会被完全嵌入到CSS文件中(不过幸运的是也可以被gzip了,而图片文件被gzip效果不明显)。
3.编码成本
图片完成后还需要base64编码,目前估计手工完成的多,因此,增加了一定的工作量,虽然不多。
五、优缺点权衡下的实际应用价值
权衡上面所展示的优缺点,貌似base64:URL图片没有什么用武之地啊,实际上非也,有一种情况时有base64编码作为background-image背景图片利要远大于弊的。何种情况呢?
在web页面制作的时候,由于某些现实原因,我们可以会用到下面这一类图片:
1.这类图片不能与其他图片以CSS Sprite的形式存在,只能独行
2.这类图片从诞生之日起,基本上很少被更新
3.这类图片的实际尺寸很小
4.这类图片在网站中大规模使用
想想看,你的网站中有没有同时满足上面四条的背景图片呢?
//zxx: 假设已经过去了今天朝鲜火箭勃起的时间
怎样,想到了没?提点下,例如下面这个企鹅微博中的loading gif图片(537字节,勉强算是):
537字节的大小实际上还是偏大了点,让我们看个更better的例子,大家可以去豆瓣首页,可以看到下图所示的垂直线:
为background-image图片(for 等高布局):
从bg_line.png这样的命名可以预知(不是:home_bg_line.png),该背景图片会在(可以在)网站中多处使用。
图示平铺图片地址为:http://upload.chinaz.com/2012/0606/1338961513462.png
大小1 * 1 像素,png格式,大小88字节。//zxx: 当图片颜色简单到一定程度的时候,gif格式图片大小要小于png8, 所以,这个点如果保存成gif格式,只需要43字节,为png一半大小
像这种图片大小极小,但又占据了一次HTTP请求,同时不能与其他背景图片Sprite,而网站很多地方都使用。因此,没有什么背景图片比这个更适合使用本文的“base64:URL图片”技术进行优化了!
为了比对优化的好处,我们来看个实际的demo.
六、base64:URL图片的实际应用
我博客首页的个人信息介绍处的虚点是使用背景图片实现的(考虑到IE6 dot边框跟dashed搞基,不同浏览器虚点间距差异等)。
现在,demo就要展示如何使用base64:URL图片实现该虚点效果。
您可以狠狠地点击这里:base64 URL虚点背景demo
相关CSS代码如下:
.dot {
background-image: url(data:image/gif;base64,R0lGODlhBAABAIABAMLBwfLx8SH5BAEAAAEALAAAAAAEAAEAAAICRF4AOw==);
*background-image: url("http://upload.chinaz.com/2012/0606/1338961513409.gif"); // IE6~IE7
background-repeat: repeat-x;
background-position: left bottom;
}
可以看到,使用base64的CSS代码量基本上跟下面使用完整地址差不多,因此,对于一些级小尺寸图片,所谓增加CSS文件大小的不足可以忽略(再考虑到gzip),同时减少了1个HTTP请求,加上这个图片网站很多地方使用,因此,累积节约的HTTP请求就很惊人了。
当然,唯一美中不足的是,对于IE6~IE7浏览器不能享受到这种“百利仅一害”的优化技术,我们还需要专门为它们擦屁股。不过,权衡来看,还是很值得的,毕竟目前,在中国IE8浏览器是大头(就在最近),IE6,IE7 就乖乖地泻下去吧。
最后,展示下demo页面YSLOW分析图吧,可以看到,没有任何CSS background-image请求。
七、虽是一篇小短文,结尾也要干爹疼
IE6/IE7又一次暴露了自己的屌丝形象,对其,我已无力再次吐槽,不过,毕竟历史长河中的有功之人,就等其静静退出历史舞台吧。
再次提醒下,使用base64编码代替CSS背景图片是有局限性的,并不是所有图片都适合使用base64编码这种技术的。例如:
1. CSS Sprite图片后期维护会死人,只能是独立图片
2. 图片尺寸过大,CSS文件就会变成了臃肿的大棒子,反而不利于加载
3. CSS文件的优点就是重用,因此,如果背景图片就一个地方使用,减少的请求数有限,考虑到其他成本,还不如直接使用普通url图片地址
4. 如果图片经常改动,好吧,哥们,苦逼的前端加班仔中就多了一个你
因此,技术本身虽好,需天时地利人和方可使用。
在微博上,@朴灵提过MHTML这个东东,好像与base64编码相关的,对此我几乎一无所知,希望有相关了解的人可以补充下。
另外,周末时节,想着明早可以睡到自然醒,文笔过于仓促,出现错误在所难免,文中有表述不准确的地方欢迎指正,感谢阅读,祝大家周末快乐!
原创文章,转载请注明:张鑫旭-鑫空间-鑫生活
本文地址:http://www.zhangxinxu.com/wordpress/?p=2341
分享到:
相关推荐
vue-cli3.0图片打包,小于10k的图片没有自动转base64问题处理
例如,使用`base64.b64encode()`函数读取图片二进制数据并编码,再将其转化为字符串。 - JavaScript也有类似的`btoa()`函数(浏览器环境)或`Buffer`对象(Node.js环境)来处理此操作。 3. **Base64编码在Web开发...
在IT行业中,Base64是一种数据编码方法,它将二进制数据转化为可打印的ASCII字符串形式。在网页开发中,特别是在JavaScript环境下,将图片转换为Base64字符串有着广泛的应用,例如在处理小体积的图像、实现数据的轻...
输出:图片base64代码-img html代码-图片base64背景css代码 简单、高级和功能转换器扩展 BaseConverter 类 有 5 种枚举类型 有 2 个模型用于获取 Exif 和图像属性 使用旧版本(init first_release.php): $image...
3. **SEO**:内联的base64图片可能会影响搜索引擎对图片的索引和识别。 总的来说,CSS图片下载器是网页开发和设计过程中一个实用的辅助工具,它能够简化图片管理,提高工作效率,但使用时也需要根据具体项目需求和...
在IT领域,Base64是一种数据编码方法,用于将二进制数据转化为可打印的ASCII字符,以便在电子邮件、HTML或CSS等不支持二进制传输的环境中传递。"tobase64"是一个工具,它能将图像和文件转换成Base64格式。这个工具的...
它通过将图片数据编码为Base64格式,然后在CSS的`url()`函数中引用这段编码的字符串。Base64是一种编码方法,能将任意二进制数据转换为可打印的ASCII字符,其中64个字符代表了所有可能的值。 具体步骤如下: 1. **...
如果图片是通过网络URL引用的,iText会尝试下载并嵌入到PDF中。 在实际应用中,可能需要自定义`HTMLWorker`的行为,例如更改字体设置、调整页面布局或处理特定的HTML标签。iText提供了一些回调接口,允许开发者对...
4. **在Web开发中的应用**:Base64编码常用于内联CSS和HTML中的背景图片,或者在JSON响应中传输小文件,以减少HTTP请求的数量。 5. **效率与性能**:虽然Base64编码增加了数据的大小(约1/3),但减少了网络传输的...
Base64 Auto-Linker crx插件是一款专为网页浏览设计的实用工具,主要功能是将页面中的Base64编码字符串自动转化为可点击的链接。这个插件特别适合那些频繁处理Base64数据的开发者或者对编码感兴趣的用户,它可以极大...
用户选择图片后,通过FileReader API读取文件内容,然后使用Canvas的drawImage方法将图片绘制到画布上,最后可以通过toDataURL方法将画布内容转换为Base64编码的URL,显示在页面上。这种方法适用于现代浏览器,支持...
Webpack会将CSS打包到单独的CSS文件中,而图片则会被转化为Base64编码或者输出到特定的目录。因此,当我们在CSS中引用背景图片时,需要确保Webpack知道如何正确处理这些资源。 1. **问题分析**: - **路径问题**:...
`FileReader`提供了`readAsDataURL`方法,可以将文件内容转化为Base64编码的URL,这可以直接用作图片的`src`属性。 ```javascript var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = ...
2. 文件读取:使用File API的`FileReader`对象读取选中的文件,将其转化为Base64编码的数据URL。 3. 图片预览:在Canvas上绘制数据URL,或者利用CSS将图片数据设置为背景,创建预览效果。 4. 更新界面:根据需要,...
`canvas2image` 是一个轻量级的JavaScript库,它能够将Canvas对象转换为Image对象,从而可以使用`toDataURL`方法生成Base64编码的图片URL。这个URL可以直接设置为img标签的src,也可以用于下载或发送到服务器。基本...
- 然后,构造请求参数,这通常包括图片URL或base64编码的图像数据,以及识别的特定选项,如识别语言类型。 - 使用AK和SK生成签名,确保请求的安全性。 - 发送POST请求到API接口,将请求参数和签名一并传递。 - ...
5. **导出图像**:使用`canvas.toDataURL()`将Canvas内容转化为Base64编码的图片URL,或者直接下载为图片文件。 总的来说,截屏DOM元素涉及到了前端技术的多个方面,包括DOM操作、Canvas绘图、跨域策略和第三方库的...
内容概要:本文详细阐述了短链服务的概念与应用场景,主要讨论了长链转化为短链的需求背景和技术手段,涉及哈希算法、Base62编码及ID生成器方法。文章深入探讨了URL重定向机制以及解决哈希碰撞的问题策略,确保生成...
这个区域的像素数据通过`getImageData`方法获取,并转化为data URL,最后设置为放大镜div的背景图像。 至此,一个基本的JavaScript图片放大镜效果已经实现。为了使效果更佳,可以添加额外的功能,如动画过渡、边界...
这段代码会创建一个隐藏的`<a>`标签,设置其`download`属性为下载文件名,`href`属性为生成的图片数据URL,然后模拟点击事件触发下载。 4. 配置选项:HTML2canvas提供了一系列配置参数,允许开发者调整渲染行为,...