来自Canvas的getImageData之后,通过Ajax将uint8clampedarray数组发送到JavaScript中的C#

时间:2019-07-09 23:59:48

标签: javascript c# arrays ajax canvas

我正在javaScript的客户端上创建一个签名,然后尝试通过ajax将结果发送到后面的代码(c#)。我尝试传递的结果数组的类型为uint8clampedarray,但我无法执行,方法背后的代码从未被击中。 它击中了Page Load方法,但没有击中SetSignature方法。

javaScript

var signatureByteArray = signature.getSignatureImage();
    SendArrayViaAjax(signatureByteArray);

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

function SendArrayViaAjax(signatureArray) {
    var sigArray = JSON.stringify( signatureArray);
        $.ajax({
            type: "POST",
            data: { array: sigArray },
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            url: "/Intranet/OHS/SOP/SOPSignOffs.aspx/SetSignature",
            success: function (msg) {
                alert(msg.d + "success");
            },
            error: function (response) {
                alert("an error has taken place");
            }
    });
}

背后的代码

[WebMethod]
public static string SetSignature(string[] array)
{
    var x = array[2];
    return "success";
}

我的问题是如何通过ajax以uint8clampedarray的形式发送数组,以及如何在c#中检索它?还是有更好的方法?

ctx = canvas.getContext("2d");` 

是获取Canvas元素的方式。 thew签名的生成确实很好,只是将其发送回C#就是问题所在。

1 个答案:

答案 0 :(得分:0)

我发现的解决方案是用不同的方式(旧方法)生成画布图像数据。

不同地生成图像

function getSignatureImage() {
    //return ctx.getImageData(0, 0, canvas.width, canvas.height).data;
    var pic = canvas.toDataURL("image/png");
    pic = pic.replace(/^data:image\/(png|jpg);base64,/, "")
    return pic;
} 

然后在 ajax功能

$.ajax({
    type: "POST",
    data: '{"imageData" : "'+ signatureImage + '" }',
    ....

然后在后面的代码

public static string SetSignature(string imageData)
{
    string filePath = HttpContext.Current.Server.MapPath("Signature.png");
    using (FileStream fs = new FileStream(filePath, FileMode.Create))
    {
        using (BinaryWriter bw = new BinaryWriter(fs))
        {
            byte[] data = Convert.FromBase64String(imageData);
            bw.Write(data);
            bw.Close();
        }
    }
}