1

我在下面创建了一个测试代码,您可以在 Jsfiddle 上对其进行操作:

http://jsfiddle.net/Stallman41/57hvX/31/
HTML:

<canvas id="test_canvas" style="background-color : #FFFF00" ; width="500px"
; height="340px"></canvas>
<br>
<button id="test_put_btn">Put an image</button>
<br>
<button id="save_dataURL">Save to dataURL</button>
<br>
<button id="draw_back">Final step: draw 3 images back.</button>
<br>
<img id="first_img"; width="100px" ; height="100px" ;></img>
<img id="second_img"; width="100px" ; height="100px" ></img>
<img id="third_img"; width="100px" ; height="100px" ;></img>

Javascript:

var drawing_plate;
var context;
var dataURL_arr = new Array();
$(document).ready(function () {
drawing_plate = document.getElementById("test_canvas");
context = drawing_plate.getContext('2d');


$("#test_canvas").bind("mousedown", Touch_Start);
$("#test_canvas").bind("mousemove", Touch_Move);
$("#test_canvas").bind("mouseup", Touch_End);


}); //document ready. 



function Touch_Start(event) {
event.preventDefault();
touch = event;
touch_x = touch.pageX;
touch_y = touch.pageY;

line_start_x = touch.pageX - 0;
line_start_y = touch.pageY - 0;

context.beginPath();
context.moveTo(line_start_x, line_start_y);
}

function Touch_Move(event) {
event.preventDefault();
touch = event; //mouse
line_end_x = touch.pageX - 0;
line_end_y = touch.pageY - 0;
context.lineTo(line_end_x, line_end_y);
context.stroke();
}


$("#test_put_btn").click(function () {
var test_img = new Image();
test_img.src = "http://careerscdn.sstatic.net/careers/gethired/img/careers2-      ad-header-so-crop.png";
context.drawImage(test_img, 0, 0);
});

$("#save_dataURL").click(function () {

dataURL_arr.push(drawing_plate.toDataURL("image/png"));
});

$("#draw_back").click(function () {
  var f_image= $("#first_img")[0];
  var s_image= $("#second_img")[0];
  var t_image= $("#third_img")[0];

f_image.onload= function()
{
    f_image.src= dataURL_arr[0];
}
    f_image.src= dataURL_arr[0];

s_image.onload= function()
{
    s_image.src= dataURL_arr[0];
}
    s_image.src= dataURL_arr[0];      

t_image.onload= function()
{
    t_image.src= dataURL_arr[0];
}
     t_image.src= dataURL_arr[0];

});


我在Android系统上开发了一个绘图板,将绘图保存到一个dataURL字符串中。他们可以在画布上绘制一些东西并将图像放在画布上。而且我需要让用户在小图标上看到他们的绘图。
canvas.toDataURL("image/png")用来保存base64字符串。我选择<img>作为小图标容器。但是,我得到的只是图标上可以显示图纸,通常,当我写img.src= canvas.toDataURL("image/png");图像时,什么都没有显示!
我调查这个问题很长时间。
1.我认为问题可能是dataURL字符串太长了?
2.操作系统的支持:Android?


此处 Jsfiddle 中的代码显示了我的 Android PhoneGap 开发中的类似过程。
首先,您只需在画布上绘制一些东西,然后按Press an image,然后按Save to dataURL。但是你应该把这个过程做三遍。在这种情况下,字符串数组包含由图纸和图像生成的 base64 字符串。
最后,您按下Final step: draw 3 images back.,图像图标上不会显示任何内容。
总结:
根据我的经验,正如我所写img.src= canvas.toDataURL("image/png");(无论 img 是 dom 元素还是var img = new Image();)。它并不总是有效:有时它有效……但有时不……(我在 Android 4.0.1 上工作,phonegap 1.7.0)


其次,特别是如果我将大量 base64 字符串存储到一个数组中,并将它们分配给大量图像 DOM 元素,它肯定会失败。
第三,如果用户只在画布上画一些东西,它总是可以工作的。(除了Jsfiddle中的示例代码,但它适用于我的Android系统......)但是如果他绘制图像context.drawImage(~),图像不会显示图。
太多的困惑......
我需要让用户可以在小图标中查看他们的图纸,还有其他选择吗?


一些参考资料:

1
2
3

4

2 回答 2

1

我只是偶然发现了这个问题。

单击Put an image,然后单击Save to dataURL,然后检查您的 JavaScript 控制台是否有类似的内容:

    SecurityError: DOM Exception 18

这是一个浏览器安全功能。因为您插入了来自不同域的图像,所以它被视为跨域请求。

如果您消除了安全错误,您可以将画布导出到数据 URL。

于 2013-04-02T16:43:44.243 回答
0

您的代码中的另一件事。

您尝试在您的 test_put_btn onclick 事件处理程序中绘制到画布上的图像,您的图像将永远不会显示(或者它有时会意外工作),因为您无需等待图像加载到画布上。

您必须处理图像的“onload”事件并将其绘制到处理程序中以允许绘制图像。

在你的 test_img.src 语句之前,你必须把:

test_img.onload = function() 
{
   context.drawImage(test_img, 0, 0);
};

另外,您尝试访问的图像无法访问-->对我来说它不起作用

于 2014-11-13T09:17:48.097 回答