如何保存 HTML5 canvas 标记和 canvas 中加载的图像?

How can I save both the HTML5 canvas marks AND the image loaded in the canvas?

我有一个 canvas 可以加载图像。然后,用户使用加载的图像作为背景在 canvas 上做标记。当我尝试保存图像(使用 toDataURL())和用户所做的标记时,它只保存标记,而不是我加载到 canvas 中的 "background" 图像。我可以一次保存两个吗?

我想稍后重新加载图像和标记。如果我不能将两者都保存在一个 Base64 字符串中,那么如果可能的话,我将不得不做某种图像叠加。最好直接保存。

下面是加载图片和保存标记的代码。我不认为制作标记代码是相关的,所以我省略了细节。

感谢您的帮助。

function SetUp() {

/// load the image
LoadImage();

/// Draw existing marks
DrawMarkedItems();
}


        function LoadImage() {
            var canvas = document.getElementById("imageView");
            if (canvas != null) {
                if (canvas.getContext) {
                    var context = canvas.getContext('2d');
                    var img = new Image();
                    img.onload = function () {
                        context.drawImage(img, 15, 15, 620, 475);
                    }
                    img.src = '../Images/Outline.png';
                }
            }
        }



function DrawMarkedItems() {

var canvas = document.getElementById("imageView");
if (canvas != null) {
 if (canvas.getContext) {
  var list = GetInfoList();  
  if (list.length == 0)
   return;

  var pairs = list.split('|').length;
  for (var i = 0; i < pairs; i++) {

  /// Get the X,Y cooridinates other data 
  /// saved previously in GetInfoList()
  /// and draw the marks back on the 
  /// canvas with image backgroun
  
  }
 }
}
}


        function SaveImage()
        {
            var canvas = document.getElementById("imageView");
            var image = canvas.toDataURL("image/png", 0.1);
            image = image.replace('data:image/png;base64,', '');
                 
            /// WebMethod in code behind
            var retval = PageMethods.SaveImage(image);

        }

好的,我明白了。我首先加载背景图像,然后在 canvas 上绘制现有标记(在 Setup() 中调用 LoadImage(),然后调用 DrawMarkedItems())。

我将对 DrawMarkedItems() 的调用移到了 LoadImage() 函数中,特别是在 img.onload 函数中。

下面是修改后的函数。希望这对其他人有帮助:

function LoadImage() {
        var canvas = document.getElementById("imageView");
        if (canvas != null) {
            if (canvas.getContext) {
                var context = canvas.getContext('2d');
                var img = new Image();
                img.src = '../Images/Outline.png';  //moved up for cosmetics
                img.onload = function () {
                    context.drawImage(img, 15, 15, 620, 475);
                    ***DrawMarkedItems();***
                }                    
            }
        }
    }