0

我从 codeproject 下载了一些名为 signaturecanvas 的代码,它使用 HTML5 控件画布生成签名控件。它工作得很好。但我被困在这部分。我不知道如何将 signaturebytearray 保存为 jpeg 图像,以便之后显示?

链接到 javascript 源: http: //www.codeproject.com/Articles/432675/Building-a-Signature-Control-Using-Canvas

默认.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
     <link href="signature.css" rel="scripts/stylesheet" type="text/css" />
    <script type="text/javascript" src="scripts/signature.js"></script>  
    <script type="text/javascript">
        function loaded() {
            var signature = new ns.SignatureControl({
                containerId: 'container', callback: function () {
                    var signatureByteArray = signature.getSignatureImage();
                }
            });
            signature.init();
        }

        window.addEventListener('DOMContentLoaded', loaded, false);

    </script>  
</head>
<body>
    <form id="form1" runat="server">
    <div id="container">

    </div>
    </form>
</body>
</html>
4

2 回答 2

1

幸运的是,不需要将原始数据发送到服务器 - 只需在画布控件中修改此功能 -

改变这个signature.js

function getSignatureImage() {
    return ctx.getImageData(0, 0, canvas.width, canvas.height).data;
}

改为这样做(或添加一个具有不同名称的新函数 - 例如):

function getSignatureImage(quality) {
    return canvas.toDataURL('image/jpeg', (quality ? quality : 0.7));
}

现在它将返回一个 data-uri,您可以将其设置为元素的图像源:

var img = new Image;
img.src = signature.getSignatureImage();

或者,如果您想要更多或更少的压缩,请提供质量参数:

img.src = signature.getSignatureImage(0.5);

data-uri 包含一个标头和作为 base64 编码字符串的图像数据(JPEG 文件)。您可以根据需要提取 base64 数据或按原样存储。

关于格式的一点点:

从原始函数返回的字节数据是一个字节数组,其中包含所有未压缩的数据,包括一个 alpha 通道(字节 = 宽度 * 高度 * 4)。出于技术原因,在客户端进行压缩并非易事,将其发送到服务器意味着您发送原始未压缩图像,这会产生很大的开销。

在 data-uri 的情况下,您将获得编码为 base-64 的 JPEG(或 PNG)压缩图像。与原始数据相比,base-64 编码增加了 33% 的开销,但在大小方面仍然比发送原始数据更好。

使用这种方法,您实际上不必在服务器端做太多事情,除非您想存储二进制数据,以防您只是截取标头并使用 base-64 解码其余数据。

于 2013-10-10T19:26:01.073 回答
0

我认为您需要将字节数组发送到服务器并将其保存在那里。所以也许添加一个“保存”按钮并使用 ajax 发布签名:

$.post("saveimage.aspx", { sig: signature.getSignatureImage() }, function() { alert('Signature saved'); });

然后在 saveimage.aspx 或任何你想保存签名图像的地方,比如:

byte[] bitmap = (byte[])Request.Form["sig"];
using(Image image = Image.FromStream(new MemoryStream(bitmap)))
{
    image.Save("signature.jpg", ImageFormat.Jpeg);
}
于 2013-10-10T16:03:32.103 回答