【问题标题】:Saving and loading canvas data from localStorage从 localStorage 保存和加载画布数据
【发布时间】:2016-01-03 14:54:11
【问题描述】:

我需要保存画布中的所有绘图,以便以后能够返回它们。

我成功获取和放置数据,但我无法保存对象并正确返回。

这是我的代码:

var imgData = a.getImageData(0, 0, 500, 200);
localStorage.setItem("test",JSON.stringify(imgData))
console.log(imgData)
console.log(JSON.parse(localStorage.getItem("test")))
b.putImageData(imgData, 0, 0);

【问题讨论】:

    标签: javascript jquery html local-storage


    【解决方案1】:

    您可以使用canvas.toDataURL() 方法将画布编码为Base64。

    然后您可以创建一个以数据 url 为源的图像,然后将该图像绘制到画布上。

    Here is the working sample.

    var canvas = document.getElementById('tutorial');
    var ctx = canvas.getContext('2d');
    
    var ctx = canvas.getContext("2d");
    
    ctx.fillStyle = "rgb(200,0,0)";
    ctx.fillRect (10, 10, 55, 50);
    
    var url = canvas.toDataURL();
    
    localStorage.setItem('url', url);
    
    var canvas2 = document.getElementById('tutorial2');
    var ctx2 = canvas2.getContext("2d");
    var toDrawUrl = localStorage.getItem('url');
    
    drawDataURIOnCanvas(toDrawUrl, ctx2);
    ctx2.fillStyle = "rgb(200,200,0)";
    ctx2.fillRect (20, 20, 55, 50);
    
    
    function drawDataURIOnCanvas(strDataURI, context) {
        "use strict";
        var img = new window.Image();
        img.addEventListener("load", function () {
            context.drawImage(img, 0, 0);
        });
        img.setAttribute("src", strDataURI);
    }
    

    【讨论】:

    • 我已经尝试过了,但我想在新画布中编辑形状并在需要时再次保存形状,如果我使用“toDataURL”,我无法删除或编辑形状中的部分并再次保存
    • @Elbazz 我假设你只想要图像数据。我们在画布上绘制图像后,只需获取图像数据即可。或者这可能会给你一个关于序列化图像数据的想法stackoverflow.com/a/22233902/548568
    • 非常感谢我成功保存到本地存储,但是通过抓住完整点,您的链接可以帮助我,我对此发表评论
    【解决方案2】:

    我想将海量数据作为 imagedate 保存在本地存储中,您必须从缓冲区转换为字符串并使用此功能

        function buf2str(buf) {
           var bufView = new Uint16Array(buf);
           var unis =""
           for (var i = 0; i < bufView.length; i++) {
                 unis=unis+String.fromCharCode(bufView[i]);
            }
           return unis
       }
    

    使用这个函数来反转函数

    function str2buf(str) {
        var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
        var bufView = new Uint16Array(buf);
        for (var i=0, strLen=str.length; i<strLen; i++) {
            bufView[i] = str.charCodeAt(i);
        }
        return buf;
    }
    

    我已成功保存数据并在回调后编辑它

    我的代码是

     var canvasData={
        _save:function(from,id){
            var imgData = from.getImageData(0, 0, el.width, el.height);
            var buffer = imgData.data.buffer;
            var testV=ab2str(buffer);
    
            try { 
                localStorage.setItem(id+"Length",testV._length)
                localStorage.setItem(id+"Keys",testV._keys)
                localStorage.setItem(id+"Data",testV._Data)
            } catch(e) {
                var storageSize = Math.round(JSON.stringify(localStorage).length / 1024);
                console.log("LIMIT REACHED: (" + i + ") " + storageSize + "K");
                console.log(e);
                 alert("your localStorage is complete , you must delete some nots or markers to be can store again ")
    
        }
    
    
        },
        _return:function(to,id){
            var tempObj={_Length:0,_Keys:"",_Data:""}
    
    
             try {     
                tempObj._Length= localStorage.getItem(id+"Length")
                tempObj._Keys= localStorage.getItem(id+"Keys")
                tempObj._Data= localStorage.getItem(id+"Data")
            } catch(e) {
                var storageSize = Math.round(JSON.stringify(localStorage).length / 1024);
                console.log("LIMIT REACHED: (" + i + ") " + storageSize + "K");
                console.log(e);
    
        }
    
            if (tempObj ==null ){return false};
            if (tempObj._Length ==null ){return false};
            if (tempObj._Keys ==null ){return false};
             if (tempObj._Data ==null ){return false};
            var temp=tempObj._Length.split(",");
            var newWidth=parseInt(temp[0]);
            var newHeight= parseInt(temp[1]);
            var newImgData = to.createImageData(newWidth,newHeight);
            var incomingBuffer=returnOriginalBuffer(tempObj)
            newImgData.data.set(new Uint8Array(incomingBuffer))
    
            to.putImageData(newImgData, 0, 0);
    
        }
    } 
    function ab2str(buf) {
        var bufView = new Uint16Array(buf);
        var dataArr=new Array();
        var dataStr =""
        var keysStr =""
        var lenStr=el.width.toString()+","+el.height.toString()
        var returnedObj={_length:lenStr,_keys:"",_Data:""}
        var dote="";
        for (var q = 0; q < bufView.length; q++) {
            if(bufView[q]!=0){
                keysStr=keysStr+dote+q;
                dote=","
                dataArr.push(bufView[q]);
            } 
        }
        for (var w = 0; w < dataArr.length; w++) {
            dataStr=dataStr+String.fromCharCode(dataArr[w]);
        }
    
        returnedObj._keys=keysStr;
        returnedObj._Data=dataStr;
    
    
        return returnedObj
        }
    function returnOriginalBuffer(tempObj) {
        var temp=tempObj._Length.split(",");
        var _length=parseInt(temp[0])*parseInt(temp[1])*2
        var _keys=tempObj._Keys;
        var _data=tempObj._Data;
        var keysArr =new Array();
        var dataArr=new Array();
    
        keysArr=_keys.split(",")
        for (var w=0, strLen=_data.length; w<strLen; w++) {
            dataArr[w]=_data.charCodeAt(w) ;
        }
    
    
        var buf = new ArrayBuffer(_length*2); // 2 bytes for each char
        var bufView = new Uint16Array(buf);
        var q=0
            for (var i=0, strLen=_length; i<strLen; i++) {
                if (i!=parseInt(keysArr[q])){
                    bufView[i] = 0;
                }else{
                    bufView[i] = dataArr[q]
                    q++;
    
                }
    
            }
    
      return buf;
        }
    
      //save data
             canvasData._save(ctx,"localstoragename")
    // return data
             canvasData._return(ctx,"localstoragename")
    

    如果任何人拥有简单的解决方法,此解决方案很复杂,请帮助我们

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 2021-08-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多