2009-10-19 83 views

回答

11

你并不需要一个文件输入,只是ctx.getImageData()获取数据,并将其发布到与阿贾克斯的服务器。

查看MDN Documentation for CanvasRenderingContext2D.getImageData()

但是,即使使用ExCanvas,您也无法在IE中获取图像数据。

+0

这儿还有没有人有这个实际工作?我从getImageData()返回的数据可以被发送到服务器,但我不知道如何。我尝试在jQuery.ajax和jQuery.post中使用不同的选项,但我无法确定如何在ajax请求中指定图像数据。我的服务器无法解释我发送的数据。我也找不到任何代码示例。你有什么建议吗? (我确认服务器正在通过与客户端的Curl执行相同的请求来正确工作。) 谢谢。 – Jayesh 2010-07-14 18:16:46

+1

好的,让它工作。在答案中粘贴代码。 – Jayesh 2010-07-15 04:47:54

+3

可以在IE上用fxCanvas(而不是ExCanvas)来使用它。你需要使用函数toDataURL(“image/png”,function(fxUrl){...})。 – 2011-12-03 09:40:40

34

FWIW,这是我如何得到它的工作。

我的服务器是在谷歌应用程序引擎。我使用jQuery.post发送canvas.toDataURL()的输出作为post请求的一部分。数据URL是base64编码的图像数据。因此,对服务器I将其解码并转换成图像

import re 
import base64 
class TnUploadHandler(webapp.RequestHandler): 
    dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$') 
    def post(self): 
     uid = self.request.get('uid') 
     img = self.request.get('img') 

     imgb64 = self.dataUrlPattern.match(img).group(2) 
     if imgb64 is not None and len(imgb64) > 0: 
      thumbnail = Thumbnail(
        uid = uid, img = db.Blob(base64.b64decode(imgb64))) 
      thumbnail.put() 

从客户端发送我的数据是这样的:

$.post('/upload', 
     { 
      uid : uid, 
      img : canvas.toDataURL('image/jpeg') 
     }, 
     function(data) {}); 

这可能不是做的最好的方式,但它的工作原理。

+0

感谢它的工作原理像黄油.. :) – Surya 2011-06-28 06:46:16

+0

img参数将被削减,如果它太大,有你遇到过吗? – ernest 2012-09-25 09:47:44

+0

@ernest我有搜索你提到的职位限制(我知道关于获取请求限制),我没有找到http://www.w3schools.com/tags/ref_httpmethods.asp W3school说“POST请求没有数据长度限制“ – ccsakuweb 2014-02-12 07:28:22

2

这是我去年写的一个在线签名应用程序的演示Canvas Signature Demo。这具有只将矢量数据发布到服务器的优点。使用所有的路径信息,您也可以应用平滑算法或在持续之前根据需要对其进行缩放。

<canvas id="signature" width="300" height="100"></canvas> 
<form method="post" id="signature_form" action="signing.aspx"> 
<input type="hidden" name="paths" id="paths"/> 
    <p><label>Cover #</label> <input type="text" id="covernumber" name="covernumber"/> 
    <input type="submit" id="save" value="Save"/> 
</form> 

我将路径数据存储到隐藏字段并将其发布到服务器。

signature.js核心逻辑如下:

mouseDown: function(event) { 
    var point = this.getRelativePoint(event); 
    this.paths.push([ point ]); 
    this.ctx.fillRect(point.x,point.y,1,1); 
    this.penDown = true; 
    this.updateField(); 
}, 
mouseUp: function(event) { 
    this.penDown = false; 
    this.ctx.closePath(); 
    if (Prototype.Browser.IE && event.srcElement.tagName != "INPUT") { 
     var ver = getInternetExplorerVersion(); 
     if (ver >= 8 && ver < 9 && document.selection) { 
      document.selection.empty(); 
     } 
    } 
}, 
mouseMove: function(event) { 
    if (this.penDown) { 
     var lastPath = this.paths[ this.paths.length - 1 ]; 
     var lastPoint = lastPath[ lastPath.length - 1 ]; 
     var point = this.getRelativePoint(event); 
     lastPath.push(point); 
     this.ctx.strokeStyle = "#000000"; 
     this.ctx.beginPath(); 
     this.ctx.moveTo(lastPoint.x,lastPoint.y); 
     this.ctx.lineTo(point.x, point.y); 
     this.ctx.stroke(); 
     this.ctx.closePath(); 
     this.updateField(); 
    } 
}, 
updateField: function() { 
    if (this.field) { 
     this.field.value = this.paths.toJSON(); 
    } 
} 

这是我的相关的服务器侧Net代码(C#)。

if (Request("paths")) { 
    var objBitmap : Bitmap = new Bitmap(300, 100); 
    var objGraphics : Graphics = Graphics.FromImage(objBitmap); 
    objGraphics.Clear(Color.Transparent); 
    objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

    var paths:Array = eval(Request("paths")) || []; 
    var p : int; 
    var q : int; 
    var path : Array; 

    for (p = 0; p< paths.length; p++) { 
     var path = paths[p]; 
     if (path.length == 1) { 
      objGraphics.DrawRectangle(new Pen(Color.Black), path[0].x, path[0].y, 1, 1); 
     } else { 
      for (q = 1; q<path.length; q++) { 
       var prev = path[q-1]; 
       var curr = path[q]; 
       objGraphics.DrawLine(new Pen(Color.Black), parseInt(prev.x),parseInt(prev.y),parseInt(curr.x),parseInt(curr.y)); 
      } 
     } 
    } 
    objBitmap.Save("C:\\temp\\" + Request("covernumber") + ".png", ImageFormat.Png); 
    objBitmap.Dispose(); 
    objGraphics.Dispose(); 
} 
5

这是我如何解决这个问题。使用JavaScript将图像作为base64数组发布,然后解码并使用PHP将其保存为图像。

客户端(JavaScript):

$.post('/ajax/uploadthumbnail', 
    { 
     id : id, 
     img : canvas.toDataURL("image/png") 
    }, function(data) { 
     console.log(data); 
    }); 

服务器端(PHP):

$img = $_POST['img']; 
$img = str_replace('data:image/png;base64,', '', $img); 
$img = str_replace(' ', '+', $img); 
$data = base64_decode($img); 
$file = $_SERVER['DOCUMENT_ROOT'] . '/images/some_name.png'; 
file_put_contents($file, $data);