转换后的图像应该有一些小的url而不是BaseCode
现在我将图像上传到canvas上,在上传图像后,canvas由toDataURl转换为图像。 如果我通过toDataURL将canvas转换为图像,那么我将获得基本代码(基本代码将很大)。 我想要一些小url而不是BaseCode。
var canvas = new fabric.Canvas('canvas'); document.getElementById('file').addEventListener("change", function (e) { var file = e.target.files[0]; var reader = new FileReader(); reader.onload = function (f) { var data = f.target.result; var img = document.createElement('img'); img.src = data; img.onload = function () { if (img.width < 300 || img.height < 300) { alert("upload image should be greater"); canvas.getActiveObject().remove(); } }; fabric.Image.fromURL(data, function (img) { var oImg = img.set({left: 50, top: 100,width:100, height:100, angle: 00}).scale(0.9); canvas.add(oImg).renderAll(); var a = canvas.setActiveObject(oImg); var dataURL = canvas.toDataURL({format: 'png', quality: 0.8}); console.log("aaaaaaaaaaa" + dataURL); // console.log("Canvas Image " + dataURL); // document.getElementById('txt').href = dataURL; }); }; reader.readAsDataURL(file); }); document.querySelector('#txt').onclick = function (e) { e.preventDefault(); canvas.deactivateAll().renderAll(); document.querySelector('#preview').src = canvas.toDataURL(); var b= canvas.toDataURL(); console.log(b); }
canvas{ border: 1px solid black; }
Click Me!!
JSFiddle: https ://jsfiddle.net/varunPes/8gt6d7op/23/
魔鬼在细节中 – 你问的任何地方甚至建议你想把图像发送到某个地方 – 下面的代码仅限于客户端 – 你只能在客户端上使用短格式url,并且如评论中所述,仅用于会话(重新启动浏览器,url无用),或者直到
revokeObjectURL
你可以 – 如果浏览器支持它,使用Blob,它的URL很短
// converts a dataURI to a Blob function dataUriToBlob(dataURI) { var byteString = atob(dataURI.split(',')[1]); var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; var arrayBuffer = new ArrayBuffer(byteString.length); var _ia = new Uint8Array(arrayBuffer); for (var i = 0; i < byteString.length; i++) { _ia[i] = byteString.charCodeAt(i); } var dataView = new DataView(arrayBuffer); var blob = new Blob([dataView], { type: mimeString }); return blob; } // cross browser cruft var get_URL = function () { return window.URL || window.webkitURL || window; }; // ... your code, which eventually does this var b = canvas.toDataURL(); // get an URL from the Blob var blob = dataUriToBlob(b); var url = get_URL().createObjectURL(blob); console.log(url); // // ... when finished with the object URL URL.revokeObjectURL(url);
如果要避免发送dataURL,可以使用此函数将其转换为DataForm:
function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(',')[0].indexOf('base64') >= 0) byteString = atob(dataURI.split(',')[1]); else byteString = unescape(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], {type:mimeString}); }
然后,称之为:
var dataURL = canvas.toDataURL('image/jpeg', 0.5); var blob = dataURItoBlob(dataURL); var fd = new FormData(document.forms[0]); fd.append("canvasImage", blob);
最后,发送此表单(常规或ajax)。
来源回答