从localStorage

时间:2016-01-03 14:54:12

标签: javascript jquery html5 local-storage

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

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

这是我的代码:

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);

2 个答案:

答案 0 :(得分:3)

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

然后,您可以创建一个图像,其中源是数据网址,然后将该图像绘制到画布上。

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);
}

答案 1 :(得分:0)

我想将大数据保存为本地存储中的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")

如果有任何一个简单的解决方法,这个解决方案很复杂,帮助我们