DataURL 与 File,Blob,canvas 对象之间的互相转换

栏目: Html5 · 发布时间: 6年前

内容简介:File 对象也是一个 Blob 对象,二者的处理相同。example:File 继承于 Blob,扩展了一些属性(文件名、修改时间、路径等)。绝大多数场景下,使用 Blob 对象就可以了。
let dataurl = canvas.toDataURL("image/png");
let dataurl2 = canvas.toDataURL("image/jpeg", 0.8);
复制代码

File 对象转换为 dataURL、Blob 对象转换为 dataURL

File 对象也是一个 Blob 对象,二者的处理相同。

function readBlobAsDataURL(blob, callback) {
  let a = new FileReader();
  a.onload = function(e) {
    callback(e.target.result);
  };
  a.readAsDataURL(blob);
}
复制代码

example:

readBlobAsDataURL(blob, function(dataurl) {
  console.log(dataurl);
});

readBlobAsDataURL(file, function(dataurl) {
  console.log(dataurl);
});
复制代码

dataURL 转换为 Blob 对象、dataURL 转换为 File 对象

File 继承于 Blob,扩展了一些属性(文件名、修改时间、路径等)。绝大多数场景下,使用 Blob 对象就可以了。

兼容性:Edge 浏览器不支持 File 对象构造函数,也就是 Edge 里不能 new File()。

dataURLtoBlob

function dataURLtoBlob(dataurl) {
  let arr = dataurl.split(",");
  let mime = arr[0].match(/:(.*?);/)[1];
  let bstr = atob(arr[1]);
  let n = bstr.length;
  let u8arr = new Uint8Array(n);

  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }

  return new Blob([u8arr], { type: mime });
}
复制代码

dataURLtoFile

function dataURLtoFile(dataurl, filename) {
  let arr = dataurl.split(",");
  let mime = arr[0].match(/:(.*?);/)[1];
  let bstr = atob(arr[1]);
  let n = bstr.length;
  let u8arr = new Uint8Array(n);

  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }

  return new File([u8arr], filename, { type: mime });
}
复制代码

test

let blob = dataURLtoBlob("data:text/plain;base64,YWFhYWFhYQ==");
let file = dataURLtoFile("data:text/plain;base64,YWFhYWFhYQ==", "test.txt");
复制代码

dataURL 图片数据绘制到 canvas

先构造 Image 对象,src 为 dataURL,图片 onload 之后绘制到 canvas

let img = new Image();
img.onload = function() {
  canvas.drawImage(img);
};
img.src = dataurl;
复制代码

File,Blob 的图片文件数据绘制到 canvas

还是先转换成一个 url,然后构造 Image 对象,src 为 dataURL,图片 onload 之后绘制到 canvas

利用上面的 readBlobAsDataURL 函数,由 File,Blob 对象得到 dataURL 格式的 url,再参考 dataURL 图片数据绘制到 canvas

readBlobAsDataURL(file, function(dataurl) {
  let img = new Image();
  img.onload = function() {
    canvas.drawImage(img);
  };
  img.src = dataurl;
});
复制代码

不同的方法用于构造不同类型的 url (分别是 dataURL, objectURL(blobURL), filesystemURL)。这里不一一介绍,仅以 dataURL 为例。

filesystemURL 不是指本地文件 URL 的形式(file:///….), 而是格式类似于 filesystem:http://... 的一种 URL,支持沙盒文件系统的浏览器支持(目前仅 Chrome)支持。

Canvas 转换为 Blob 对象并使用 Ajax 发送

转换为 Blob 对象后,可以使用 Ajax 上传图像文件。

先从 canvas 获取 dataurl, 再将 dataurl 转换为 Blob 对象

let dataurl = canvas.toDataURL("image/png");
let blob = dataURLtoBlob(dataurl);
//使用 ajax 发送
let fd = new FormData();
fd.append("image", blob, "image.png");

let xhr = new XMLHttpRequest();
xhr.open("POST", "/server", true);
xhr.send(fd);
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

多处理器编程的艺术

多处理器编程的艺术

(美)Maurice Herlihy、(美)Nir Shavit / 机械工业出版社 / 2013-2 / 79.00元

工业界称为多核的多处理器机器正迅速地渗入计算的各个领域。多处理器编程要求理解新型计算原理、算法及编程工具,至今很少有人能够精通这门编程艺术。 现今,大多数工程技术人员都是通过艰辛的反复实践、求助有经验的朋友来学习多处理器编程技巧。这本最新的权威著作致力于改变这种状况,作者全面阐述了多处理器编程的指导原则,介绍了编制高效的多处理器程序所必备的算法技术。了解本书所涵盖的多处理器编程关键问题将使在......一起来看看 《多处理器编程的艺术》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具