1. 程式人生 > >DataURL與File,Blob,canvas物件之間的互相轉換的Javascript

DataURL與File,Blob,canvas物件之間的互相轉換的Javascript

canvas轉換為dataURL (從canvas獲取dataURL)

var dataurl = canvas.toDataURL('image/png');

var dataurl2 = canvas.toDataURL('image/jpeg', 0.8);

File物件轉換為dataURL、Blob物件轉換為dataURL

function readBlobAsDataURL(blob, callback) {
   var 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()。

function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:mime});
}
//test:
var blob = dataURLtoBlob('data:text/plain;base64,YWFhYWFhYQ==');
var file = dataURLtoFile('data:text/plain;base64,YWFhYWFhYQ==', 'test.txt');

dataURL圖片資料繪製到canvas
先構造Image物件,src為dataURL,圖片onload之後繪製到canvas

var 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){
var 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物件

var dataurl = canvas.toDataURL('image/png');
var blob = dataURLtoBlob(dataurl);
//使用ajax傳送
var fd = new FormData();
fd.append("image", blob, "image.png");
var xhr = new XMLHttpRequest();
xhr.open('POST', '/server', true);
xhr.send(fd);