image 转二进制的种种方法

根据标题来看,是个很泛泛的说法。这只是一种大致的思路。web端需要操作图片的时候,有时需要的不仅仅是一个src,可能老大要你将获取到的图片转为二进制,以方便保存、上传、复制、粘贴等等。怎么做呢?

假设你有一个<img>标签,图片已经在网页中显示出来了,你能直接(同步的)取到它的二进制格式吗?答案好像是否定的。
我们知道图片的src,如果要加载一遍src需要等待,需要异步的回调。既然图片已经显示出来了,我们为何还要再去load一遍图片呢?我是这么想的,但是现实情况好像没这么完美。

第一种方法:Ajax请求图片可以返回Blob或ArrayBuffer。后用FileReader,可以读取Blob或者ArrayBuffer

function toDataUrl(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.responseType = 'blob';  //设定返回数据类型为Blob
  xhr.onload = function() {
    var reader = new FileReader();
    reader.onloadend = function() {
      callback(reader.result);    //FileReader读取后的回调
    }
    reader.readAsDataURL(xhr.response);   //xhr.response就是一个Blob,用FileReader读取
  };
  xhr.open('GET', url);
  xhr.send();
}

用法:
toDataUrl('http://path/to/your/pic.png',function(dataUrl){
    console.info(dataUrl);   //dataUrl是base64格式
});  

该方法很慢,两个回调函数。也需要浏览器兼容

第二种方法:图片加载后用canvas画出来,然后再toDataUrl

function toDataUrl(src, callback, outputFormat) {
  var img = new Image();
  img.crossOrigin = 'Anonymous';
  img.onload = function() {
    var canvas = document.createElement('CANVAS');
    var ctx = canvas.getContext('2d');
    var dataURL;
    canvas.height = this.height;
    canvas.width = this.width;
    ctx.drawImage(this, 0, 0);
    dataURL = canvas.toDataURL(outputFormat);   //image/png, image/jpeg
    callback(dataURL);
  };
  img.src = src;
}

方法执行完后,就等着GC自动回收img和canvas对象吧。

中间变量

有时候我们要关注这个过程的中间变量。比如第一种方法产生的Blob对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 二进制数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作...
    呼呼哥阅读 21,367评论 2 12
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,498评论 0 17
  • 有没有发现我们身边不乏会说话的人,即使是第一次见面,也能聊得跟好友久不见一样。 人们第一次见面的第一印象首先是外貌...
    言海言阅读 472评论 0 1
  • 一直觉得,姐姐是个很温暖的称谓,她承载着女性的慈爱与温柔,蕴含着同龄人之间的相通与共识,她在履行姐姐的责任与使命时...
    一泓夜雨阅读 714评论 7 6
  • 01 每一个优秀的老板出现,前面都有一群更优秀的女礼仪在迎接。 摆脱了火车上的老流氓大叔后,王朴纯和周思璇到达酒店...
    王朴纯阅读 1,269评论 1 5