我想使用asp.net将多个画布保存到一个图像中。我试着用两幅画布,但它没有保存。
画布:
<div style="position:relative; width:456px; padding:0px; margin:0px;">
<canvas id="boardcanvas" width="456" height="480" style="position: absolute; left: 0; top: -220px; z-index: 0;"></canvas>
<canvas id="layer2" width="456" height="480" style="position: absolute;left: 0; top:-220px; z-index: 1;"></canvas>
</div>
<input type="button" id="btnSave" style="width:150px ; text-align:center;height:30px" name="btnSave" value="Save as Image!" />
Jquery的:
<script type="text/javascript">
// Send the canvas image to the server.
$(function () {
$("#btnSave").click(function () {
can1 = document.getElementById("broadcanvas");
ctx1 = can1.getContext("2d");
var coll = document.getElementById("layer2");
ctx1.drawImage(coll, 0, 0);
var image = can1.toDataURL("image/png");
alert(image);
image = image.replace('data:image/png;base64,', '');
$.ajax({
type: 'POST',
url: 'index.aspx/UploadImage',
data: '{ "imageData" : "' + image + '" }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (msg) {
alert('Image saved successfully !');
}
});
});
});
</script>
index.aspx.cs:
using System.IO;
using System.Web.Script.Services;
using System.Web.Services;
[ScriptService]
public partial class index : System.Web.UI.Page
{
static string path = @"E:\Green\images\\";
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod()]
public static void UploadImage(string imageData)
{
string fileNameWitPath = path + DateTime.Now.ToString().Replace("/", "-").Replace(" ", "- ").Replace(":", "") + ".png";
using (FileStream fs = new FileStream(fileNameWitPath, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
byte[] data = Convert.FromBase64String(imageData);
bw.Write(data);
bw.Close();
}
}
}
}
答案 0 :(得分:2)
为了正确使用此代码,您必须执行以下操作
工作代码是。
的Javascript
<script type="text/javascript">
// Send the canvas image to the server.
$(function () {
$("#btnSave").click(function () {
can1 = document.getElementById("boardcanvas");
ctx1 = can1.getContext("2d");
var coll = document.getElementById("layer2");
ctx1.drawImage(coll, 0, 0);
var image = can1.toDataURL("image/png");
alert(image);
image = image.replace('data:image/png;base64,', '');
$.ajax({
type: 'POST',
url: 'Default.aspx/UploadImage',
data: '{ "imageData" : "' + image + '" }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (msg) {
alert('Image saved successfully !');
}
});
});
});
</script>
Html代码
<div style="position: relative; width: 456px; padding: 0px; margin: 0px;">
<canvas id="boardcanvas" width="456" height="480" style="position: absolute; left: 0;
top: -220px; z-index: 0;">
</canvas>
<canvas id="layer2" width="456" height="480" style="position: absolute; left: 0;
top: -220px; z-index: 1;">
</canvas>
</div>
<input type="button" id="btnSave" style="position: absolute; left: 460px; width: 150px;
text-align: center; height: 30px; z-index: 2;" name="btnSave" value="Save as Image!" />
Asp.Net端代码没问题。 请尝试使用上面的代码。当然它会工作(不要忘记创建目录)。
答案 1 :(得分:1)
看起来您只将一个图像(“broadcanvas”)转换为数据网址。试试这个:
var image = ctx1.toDataURL("image/png");
非相似的变量命名可以帮助您更快地发现它。
答案 2 :(得分:0)
这是一个有效的例子:
<!DOCTYPE html>
<html>
<body>
<p>Image to use:</p>
<img id="scream" src="http://www.w3schools.com/tags/img_the_scream.jpg" alt="The Scream" width="220" height="277">
<p>Canvas:</p>
<canvas id="myCanvas" width="250" height="300" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<p> Canvas2: </p>
<canvas id="myCanvas2" width="250" height="300" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<script>
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=document.getElementById("scream");
ctx.drawImage(img,30,5);
ctx.drawImage(img,5,30);
var c2=document.getElementById("myCanvas2");
var ctx2=c2.getContext("2d");
ctx2.drawImage(c,0,0)
ctx2.drawImage(img,-10,50);
var image = c2.toDataURL("image/png");
console.log(image);
image = image.replace('data:image/png;base64,', '');
console.log(image);
</script>
</body>
</html>
这是一个有工作例子的小提琴:Fiddle
答案 3 :(得分:0)
此处的问题是您在var coll
中使用drawImage()
的画布。您应该使用其上下文。这是修复:
can1 = document.getElementById("broadcanvas");
ctx1 = can1.getContext("2d");
var coll = document.getElementById("layer2");
var ctx2 = coll.getContext("2d");
ctx1.drawImage(ctx2, 0, 0);
var image = can1.toDataURL("image/png");
答案 4 :(得分:0)
当asp.Net和基本上所有服务器端的lib通常都可以利用操作系统上的图像处理库时,问题可能会成为你想要在浏览器中进行此类数据处理的原因(在linux中像GD,GD2) ,ImageMagick等)。
是否要避免必须将两个不同的文件上传到服务器?由于采用这种方法,您只能保存在HTTP事务中,而不一定是带宽。
只是一个想法,因为它听起来不像客户端中有任何固有的东西需要在这里完成。这可能只是因为你的例子很薄弱。
答案 5 :(得分:0)
这是我的一个技巧,我有很多问题确保所有图像都已加载并可用。
创建图像后立即使用onload
事件来跟踪图像是否可以使用。我发现使用类似下面代码的东西会产生奇迹(未经测试,主要用作一般参考):
//I set to the window event to make sure it stays available. This is handy in many applications that may need to wait.
window.image1 = document.getElementById('img1');
window.image2 = document.getElementById('img2');
window.canv1 = document.getElementById('canv1');
window.canv2 = document.getElementById('canv2');
window.ctx1 = window.canv1.getContext('2d');
window.ctx2 = window.canv2.getContext('2d');
window.imagesLoaded = 0;
//load the images
window.image1.onload = function(){
window.imagesLoaded++;
}
window.image2.onload = function(){
window.imagesLoaded++;
}
//function to handle them all loading
function loaded(){
if(window.imagesLoaded==2){
//draw initial images
ctx1.drawImage(image1,0,0);
ctx2.drawImage(image2,0,0);
//at this point you should have 2 canvas's with 2 different images,
//now as I understand it you want to save them both to one canvas.
//So first grab a new canvas element.
var newImg1 = window.canv1.toDataURL('image/png');
var newImg2 = window.canv2.toDataURL('image/png');
window.canv3 = document.getElementById('canv3');
window.ctx3 = window.canv3.getContext('2d');
//this is the tricky part, side by side,
//overlapping or top/bottom by manipulating the x,y.
//I just make a general example here.
ctx3.drawImage(newImg1,0,0);
ctx3.drawImage(newImg2,10,10);
//finally create the new image as an image,
//you can do whatever you need with this
var newImg3 = window.canv3.toDataURL('image/png');
}else{
//set a timeout to retry this function if the images were not ready
setTimeout(function(){
loaded();
},100);
}
}
loaded();
我可能在这个例子中过度使用了窗口对象,很可能只需要在“imagesLoaded”变量上确保我可以看到它的更新,但这样就不需要将参数传递给函数了同样。