在画布上保存绘制的图像在服务器在asp.net
问题描述:
我能够保存图像文件在服务器,但图像保存为空白图像在画布上绘制的图像不保存,但如果我画矩形,然后图像是节省精plz帮助whts在我的代码的问题...在画布上保存绘制的图像在服务器在asp.net
脚本代码:
$(document).ready(function() {
var myCanvas = document.getElementById("Canvas1");
var myContext = myCanvas.getContext("2d");
var myImg = new Image();
myImg.src = "images/cabinbg.jpg";
myImg.onload = function() { myContext.drawImage(myImg, 0, 0); };
var dataURL = document.getElementById("Canvas1").toDataURL("image/png");
$('#<%=btnAdd.ClientID %>').live('click', function() {
dataURL = dataURL.replace('data:image/png;base64,', '');
$.ajax({
type: "POST",
url: "LayoutMaster.aspx/GetImage",
data: "{ 'image':'" + dataURL + "'}",
contentType: 'application/json; charset=utf-8',
dataType: 'json'
}).done(function (respond) {
//alert(respond);
});
});
CS文件
[System.Web.Services.WebMethod()]
public static void GetImage(string image)
{
if (image != "")
{
try
{
FileStream fs;
byte[] photo = Convert.FromBase64String(image);
fs = new FileStream(HostingEnvironment.MapPath("~/images/abc.png"), FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter br = new BinaryWriter(fs);
br.Write(photo);
br.Flush();
br.Close();
fs.Close();
}
catch (Exception e)
{
e.Message.ToString();
}
}
}
答
你是不是等待图像的onload完成你尝试之前提取画布c作为数据网址的意图。
myImg.src = "images/cabinbg.jpg";
myImg.onload = function() { myContext.drawImage(myImg, 0, 0); };
//... you go right to extracting here before onload
// above potentially has finished leaving canvas blank
// as nothing is drawn yet...
var dataURL = document.getElementById("Canvas1").toDataURL("image/png");
要解决这个问题,你需要把extrating代码onload事件中:
function extractImage() {
/* here goes the canvas.toDataUrl etc.. */
}
myImg.onload = function() {
myContext.drawImage(myImg, 0, 0);
extractImage();
}
myImg.src = "images/cabinbg.jpg";
(现在我看到你之前上传实际上斩断数据URL的头..我的不好..)
假设数据网址的实际数据(字符串)到达服务器,你似乎忘记了数据网址的标题。
对base64进行解码包括data-url的头文件不会很好。
该字符串应该是这样的(详见this link):
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
在这种情况下:
data:image/png;base64,the-base64-data...
所以,你需要做的是解析头和砍了下来最多并包括...;base64,
,然后解码剩余的字符串。
值得一提:如果您没有指定图像格式为toDataUrl
it will always be PNG。
当然,如果您期望各种格式,您需要实现更深入的解析器来读取MIME类型,编码等等。
我可能是错误的,但我同意我不等待onload函数,但仍然我的图像显示propery在我的画布,现在这里出现问题,当我上传画布的内容我变得不完整数据。我搜索了更多关于这个,我得到了几个结论,得出的结论是,我上传了2MB的数据,这是更多的数据网址处理。我仍然陷入这个问题。 – 2013-05-10 18:32:29
图像最终将显示为当加载图像被绘制到te canvas时。问题在于,当前画布的内容是在有或没有图像的情况下提取的(取决于在调用toDataURL之前图像是否足够快地绘制到画布上,这是可疑的)。可能是尺寸问题。尝试将画布提取为JPEG,以查看是否有助于传输大小。如果这有所作为,那么你就会知道。 – K3N 2013-05-10 19:01:28
我已经尝试使用图像/ jpeg,但我面临同样的问题 – 2013-05-12 13:39:51