【发布时间】:2015-05-09 03:42:54
【问题描述】:
我正在尝试制作绘图应用程序,您可以在其中通过单击“保存”按钮在画布上绘制一些东西并将结果作为图像保存在服务器上。您还可以将另一个图像作为绘图的背景。问题是,当我使用 ctx.drawImage() 将图像放到画布上时,我无法将画布保存为图像,因为没有任何反应。在我使用 ctx.drawImage() 之前一切正常。为什么我无法将画布另存为包含其他图像的图像?
我的 ajax 代码:
// it works until I use ctx.drawImage()
$.ajax({
type: "POST",
url: "save.php",
data: {image: dataURL},
success: function()
{
alert('saved');
}
});
将另一张图片作为背景的代码:
//var ctx = can.getContext('2d');
var img = new Image;
ctx.drawImage (img, 0, 0);
我的 PHP 代码:
<?php
$dataURL = $_POST["image"];
$parts = explode(',', $dataURL);
$data = $parts[1];
$data = base64_decode($data);
$fp = fopen('test.png', 'w');
fwrite($fp, $data);
fclose($fp);
?>
这是整个 javascript 代码
$(document).ready (function()
{
var color = $("#color").val();
$("#size").val("10");
var mouse = 0;
var can = document.getElementById("canny");
var ctx = can.getContext('2d');
var offsetX = 158;
var offsetY = 200;
var img = new Image;
var url = "http://i.imgur.com/fmAoxZ0.jpg";
img.src = url;
function setBackground()
{
ctx.drawImage (img, 0, 0);
}
function setOpacity(newValue)
{
$("#canny").css ("opacity", newValue * 0.01);
$("#txt-opacity").html(newValue + "%");
}
$("body").mousedown(function(event)
{
color = $("#color").val();
var cordX = event.clientX - offsetX;
var cordY = event.clientY - offsetY;
var size = $("#size").val();
ctx.beginPath();
ctx.arc(cordX,cordY,size,0,2*Math.PI);
ctx.fillStyle = color;
ctx.fill();
document.getElementById("coords").innerHTML = "x: " + cordX + " y: " + cordY;
mouse = 1;
$("body").mousemove(function(event)
{
if (mouse == 1)
{
var cordX = event.clientX - offsetX;
var cordY = event.clientY - offsetY;
var size = $("#size").val();
ctx.beginPath();
ctx.arc(cordX,cordY,size,0,2*Math.PI);
ctx.fillStyle = color;
ctx.fill();
$("body").mouseup(function()
{
mouse = 0;
});
}
});
mouse = 1;
});
$("#opacity").change (function()
{
setOpacity(this.value);
});
$("#opacity").trigger("change");
$("#red").click (function()
{
$("#color").val("#FF3636");
$(this).css ("border-color", "darkorange");
$("#blue").css ("border-color", "black");
$("#lime").css ("border-color", "black");
$("#yellow").css ("border-color", "black");
});
$("#blue").click (function()
{
$("#color").val("#0080FF");
$(this).css ("border-color", "darkorange");
$("#red").css ("border-color", "black");
$("#lime").css ("border-color", "black");
$("#yellow").css ("border-color", "black");
});
$("#lime").click (function()
{
$("#color").val("#8CFF00");
$(this).css ("border-color", "darkorange");
$("#red").css ("border-color", "black");
$("#blue").css ("border-color", "black");
$("#yellow").css ("border-color", "black");
});
$("#yellow").click (function()
{
$("#color").val("#FFF01F");
$(this).css ("border-color", "darkorange");
$("#red").css ("border-color", "black");
$("#blue").css ("border-color", "black");
$("#lime").css ("border-color", "black");
});
$("#btn-clear").click(function()
{
if (confirm ("Are you sure to clear your image?"))
{
ctx.clearRect(0, 0, can.width, can.height);
}
});
$("#btn-save").click (function()
{
var dataURL = can.toDataURL();
$.ajax({
type: "POST",
url: "save.php",
data: {image: dataURL},
success: function()
{
alert('saved');
}
});
});
$("#fill").click (function()
{
$("#canny").css ("background-color", color);
});
$('input[type=radio][name=bgselect]').change (function ()
{
if (this.value == "image")
{
setBackground();
$("#url").css ("visibility", "visible");
img.src = url;
} else
{
$('#canny').css('background-image', 'none');
$("#url").css ("visibility", "hidden");
}
});
$("#url").change(function()
{
url = $(this).val();
setBackground();
});
});
【问题讨论】:
-
您的问题可能出在
canvas.toDataURL上,如果您将跨域图像绘制到画布上,它会被禁用。调用canvas.toDataURL时,您是否在控制台中遇到安全违规? -
不,我没有收到任何错误。
-
那么我们需要更多代码。另外,dataURL 和 $parts[1] 的长度是多少,它们看起来像 dataURLs 吗?
-
如何查看这些网址?我添加了更多代码。
标签: javascript html image canvas