I want to save huge data as images in local storage, you have to convert from buffer to string and use these functions
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 }
for inverse function use this function
function str2buf(str) { var buf = new ArrayBuffer(str.length*2);
i is successful for saving data and editing after callback
my code
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);
this concession is complicated, if anyone has their own workaround, help us
source share