转换后的图像应该有一些小的 url 而不是基本代码

Converted image should have some small url instead of BaseCode

本文关键字:url 代码 图像 转换      更新时间:2023-09-26

现在我正在将图像上传到画布,上传图像后,画布由 toDataURl 转换为图像。如果我通过 toDataURL 将画布转换为图像,那么我得到的是基本代码(基本代码会很大)。我想要一些小网址而不是基本代码。

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;
}
<script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.min.js"></script>
<input type="file" id="file">
<canvas id="canvas" width="400" height="400"></canvas>
<a href='' id='txt' target="_blank">Click Me!!</a>
<br />
<img id="preview" />

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);
如果要

避免发送数据URL,可以使用此函数将其转换为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)。

来源答案