我在HTML 5 Canvas上绘制了一个带有Bezier曲线的渐变图像,如下所示:
var canvas = $('#canvas1')[0];
if (canvas.getContext) {
var context = canvas.getContext('2d');
var gradient = context.createLinearGradient(0, 0, 0, 100);
gradient.addColorStop(0, 'rgba(193,193,193,1)');
gradient.addColorStop(.20, 'rgba(160,160,160,1)');
gradient.addColorStop(.5, 'rgba(102,102,102,1)');
gradient.addColorStop(.7, 'rgba(91,91,91,1)');
gradient.addColorStop(.97, 'rgba(160,160,160,1)');
gradient.addColorStop(1, 'rgba(193,193,193,1)');
context.fillStyle = gradient;
context.fillRect(0, 0, 500, 100);
var gradient1 = context.createLinearGradient(0, 0, 0, 100);
gradient1.addColorStop(0, '#a1a1a1');
gradient1.addColorStop(.5, '#717171');
gradient1.addColorStop(1, '#a1a1a1');
context.beginPath();
context.moveTo(0, 0);
context.bezierCurveTo(0, 0, 20, 50, 0, 100);
context.lineWidth = 1;
//context.strokeStyle = 'black'; // line color
//context.stroke();
context.fillStyle = gradient1;
context.fill();
context.closePath();
}
现在我想将此图像保存在硬盘上,为此我已经形成了这个请求:
var canvas = $('#canvas1')[0];
if (canvas.getContext) {
var context = canvas.getContext('2d');
$.ajax({
url: '/Html5/Export',
type: 'POST',
data: 'img=' + escape(canvas.toDataURL("image/png")),
success: function (data) {
alert('data exported');
}
});
}
在这个服务器端,我编写了这段代码(ASP.NET C#):
[HttpPost]
public ActionResult Export()
{
string img = Request.Params["img"];
ConvertThis(img);
return Content("true");
}
public void ConvertThis(string ImageText)
{
if (ImageText.Length > 0)
{
ImageText = ImageText.Substring(ImageText.IndexOf(",") + 1);
Byte[] bitmapData;
bitmapData = Convert.FromBase64String(ImageText);
System.IO.File.WriteAllBytes(@"c:\logs\random.png", bitmapData);
}
}
但是服务器端生成的图像与Html5 Canvas 上绘制的图像完全不同。
我在这里做错了什么..
答案 0 :(得分:1)
canvas.toDataURL("image/png")
返回带有数据uri前缀的base64编码字符串,因此看起来您要对其进行两次编码。从'canvas.toDataURL'返回的字符串将如下所示:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...
如果您只对base64编码的图像感兴趣,请将其解压缩如下:
var base64Image = canvas.toDataURL("image/png");
...
data: 'img=' + base64Image.substr(base64Image.indexOf(',')),
答案 1 :(得分:0)
逃逸(canvas.toDataURL( “图像/ PNG”))
我认为它应该是encodeURIComponent而不是escape。
encodeURIComponent使用HTTP协议,而escape只编码非ASCII字符。如果您正在使用HTTP协议,请不要使用escape。
答案 2 :(得分:0)
http://www.worldwidewhat.net/2011/06/send-canvas-content-to-server/
阅读评论,可能要删除数据:图像......如user375025所述。假设你前段时间已经想到这一点,那就是为别人做好准备。