私は、ユーザーがウィンドウイメージのウィンドウペインをクリックできる単一のキャンバスを使って作業しています。アイデアは、ユーザーがクリックした場所を表示することです。イメージは(ウィンドウ上にグリルを描くことによって)変更され、JPEGに保存されます。私はキャンバス画像をクリック機能の前に保存しています。なぜなら、選択ボックスを最終画像に表示したくないからです。ただし、IEとChromeでキャンバスを復元していないキャンバスを復元すると、Firefoxに空白のキャンバスが表示されることがよくあります。これはChromeとIEで完全に機能します。助言がありますか? FirefoxはtoDataURL()
に問題がありますか?多分、ここで非同期の問題が起こっているのでしょうか?私はまた、この方法でキャンバスを保存することはメモリを大量に消費するので、これを行うためのより良い方法があるかもしれないが、私が持っているものと作業していることも認識しています。Firefox描画空のキャンバスを保存したBase64から復元するとき
コード:
/**
* Restores canvas from drawingView.canvasRestorePoint if there are any restores saved
*/
restoreCanvas:function()
{
var inverseScale = (1/drawingView.scaleFactor);
var canvas = document.getElementById("drawPop.canvasOne");
var c = canvas.getContext("2d");
if (drawingView.canvasRestorePoint[0]!=null)
{
c.clearRect(0,0,canvas.width,canvas.height);
var img = new Image();
img.src = drawingView.canvasRestorePoint.pop();
c.scale(inverseScale,inverseScale);
c.drawImage(img, 0, 0);
c.scale(drawingView.scaleFactor, drawingView.scaleFactor);
}
},
/**
* Pushes canvas into drawingView.canvasRestorePoint
*/
saveCanvas:function()
{
var canvas = document.getElementById("drawPop.canvasOne");
var urlData = canvas.toDataURL();
drawingView.canvasRestorePoint.push(urlData);
},
使用例:
readGrillInputs:function()
{
var glassNum = ir.get("drawPop.grillGlassNum").value;
var panelNum = ir.get("drawPop.grillPanelNum").value;
drawingView.restoreCanvas();
drawEngine.drawGrill(glassNum, panelNum,null);
drawingView.saveCanvas();
},
sortClick:function(event)
{
..... //Sorts where user has clicked and generates panel/glass num
.....
drawingView.showClick(panelNum, glassNum);
},
showClick:function(panelNum, glassNum)
{
var glass = item.panels[panelNum].glasses[glassNum];
var c = drawEngine.context;
drawingView.restoreCanvas();
drawingView.saveCanvas();
c.strokeStyle = "red";
c.strokeRect(glass.x, glass.y, glass.w, glass.h);
},