我在下面创建了一个测试代码,你可以在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(~)
,图像就不会显示图片。
太多的困惑......
我需要让用户可以用小图标查看他们的图纸,任何其他选择吗?
一些参考文献:
答案 0 :(得分:1)
我偶然发现了这个问题。
单击放置图像,然后单击保存到dataURL ,然后检查您的JavaScript控制台:
SecurityError: DOM Exception 18
这是一个浏览器安全功能。因为您已从其他域插入图像,所以它将被视为跨源请求。
如果您eliminate the security error,则可以将画布导出到数据网址。
答案 1 :(得分:0)
代码中的另一件事。
您尝试在画布上绘制到test_put_btn onclick事件处理程序中的图像,您的图像将永远不会显示(或者它有时会意外地工作),因为您不会等待加载图像来绘制它在画布上。
你必须处理&#34; onload&#34;您的图像事件并将其绘制到处理程序中以允许绘制图像。
在test_img.src语句之前,你必须输入:
test_img.onload = function()
{
context.drawImage(test_img, 0, 0);
};
另外,您尝试访问的图片无法访问 - &gt; For me it does not work