论坛首页 Web前端技术论坛

在浏览器中解析Base64编码图像

浏览 28219 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-10-22  
不错。用JS解决Base64的问题。小图片,少量颜色下。用div来绘图也是可以接受的。
而且,这种方法特别适合最导出。
日后还可以把Mp3,Mp4也进行base64编码。嘿嘿!
0 请登录后投票
   发表时间:2010-10-22   最后修改:2010-10-25
这东西不错
我也利用过base64做图片预览效果
0 请登录后投票
   发表时间:2010-10-22  
form_rr 写道
不错。用JS解决Base64的问题。小图片,少量颜色下。用div来绘图也是可以接受的。
而且,这种方法特别适合最导出。
日后还可以把Mp3,Mp4也进行base64编码。嘿嘿!



其实这还有另一种思路也有很意思,即javascript重新构造Base64串来实现客户端的绘图 --- 一般用于绘制一些简单的数学图形,比如sin(x)
0 请登录后投票
   发表时间:2010-10-22  
fch415 写道
Sorry,你说的是对的,我查了我们的服务器确实安装有X11,所以使用ImageIO正常。
另外查到SUN官方文档说明:
Headless mode support has been available since the J2SE 1.4 platform.
Headless mode从J2SE1.4才开始支持。
所以JIMI(since 1.1)不受此模式影响。


just forgot it, 这种辩论可以互相学习。
0 请登录后投票
   发表时间:2010-10-22   最后修改:2010-10-22
Rails 里可以写个 helper :
require 'base64'
Cache = Dir.glob("#{RAILS_ROOT}/public/img/small/*.gif").inject({}){|c, f|
  data = Base64.encode64 File.binread f
  key = File.basename f
  c[key] = %Q[<img src="data:image/gif;base64,#{data}"></img>]
  c
}
def base64img name
  Cache[name]
end


页面用起来就像这样:
<%= base64img 'abc.gif' %>


但是,传输的数据量变大了不止 1/3,因为静态资源完全可以返回 304 让浏览器读缓存的 …… 绝大部分图片——就算很小——都会得不偿失吧 ……

另外不是总能减少打开的连接数的,现在浏览器请求网页很多都是 keep-alive 重用同一连接的 ……

再另外,对一个 img 元素进行 gzip 压缩真的有意义么 …… 还不如 gzip 整个网页 ……
0 请登录后投票
   发表时间:2010-10-24  
楼上。你的data协议的base64编码的图片也可以写在css里,css一样享受304。经过简单的gzip压缩之后,传输的数据量大不了多少。

keep-alive虽然有用,但是仍然多一些request/response的过程,而且是线性的。


不过用js解码和再造图片确实不靠谱,那只是老外做的有趣的研究性项目。
0 请登录后投票
   发表时间:2010-10-25   最后修改:2010-10-25
night_stalker 写道
Rails 里可以写个 helper :
require 'base64'
Cache = Dir.glob("#{RAILS_ROOT}/public/img/small/*.gif").inject({}){|c, f|
  data = Base64.encode64 File.binread f
  key = File.basename f
  c[key] = %Q[<img src="data:image/gif;base64,#{data}"></img>]
  c
}
def base64img name
  Cache[name]
end


页面用起来就像这样:
<%= base64img 'abc.gif' %>


但是,传输的数据量变大了不止 1/3,因为静态资源完全可以返回 304 让浏览器读缓存的 …… 绝大部分图片——就算很小——都会得不偿失吧 ……

另外不是总能减少打开的连接数的,现在浏览器请求网页很多都是 keep-alive 重用同一连接的 ……

再另外,对一个 img 元素进行 gzip 压缩真的有意义么 …… 还不如 gzip 整个网页 ……



gzip之后,size基本不变,而连接数在任何情况下都不会增加,缓存照样生效。

gzip整个网页是个动态过程,而gzip某个image可以是个静态过程,一次完成,永远生效。

0 请登录后投票
   发表时间:2010-10-25  
我个人认为对于老浏览器还是转换为 http://example.com/data:image/png;base64,...... 比较好。返回的response可以设为永久不过期的缓存。反正它的内容只依赖于path,永远不会变。
0 请登录后投票
   发表时间:2010-10-25  
兼容是一个大问题
div拼图片太不实用感觉还不如用服务器生成的方法
0 请登录后投票
   发表时间:2010-10-25  
Great article, thank you!
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics