0

我有一个 MVC 4 应用程序,带有一个用于拍照的按钮,该按钮打开一个带有 javascript 的新窗口,其中包含一个 silverlight 应用程序。然后,silverlight 应用程序可以使用网络摄像头拍摄照片并将其存储为可写位图。然后我想做的是将该位图推送到我的控制器中的操作上,以保存到数据库并刷新视图。

我知道我需要将图像作为帖子发送到我的控制器,但是任何关于我将如何去做的代码示例或建议将不胜感激。我认为它应该如下工作,用于在我的 silverlight 应用程序中保存图像的按钮单击将调用 POST 到 MVC 控制器并将图像流作为参数附加到控制器中,然后控制器可以获取流并将其向上推送到数据库然后我可以关闭 silverlight 窗口。只是不确定如何进行编码。

4

3 回答 3

1

您可以使用 WebClient 发送图像。假设您的 Silverlight 应用程序中有一个字节数组中的图像:

byte[] image = ... get the image from your webcam
var client = new WebClient();
var uri = new Uri("http://example.com/photos/upload");
client.OpenWriteCompleted += (sender, e) =>
{
    var buffer = (byte[])e.UserState;
    e.Result.Write(buffer, 0, buffer.Length);
    e.Result.Close();
};
client.OpenWriteAsync(uri, "POST", image);

在 MVC 方面:

[HttpPost]
public ActionResult Upload()
{
    byte[] image = new byte[Request.InputStream.Length];
    Request.InputStream.Read(image, 0, image.Length);
    // TODO: do something with the uploaded image here ...
}
于 2012-09-19T16:41:20.523 回答
0

感谢您的答复。这正是我一直在寻找的,但是我遇到了问题。Silverlight 将网络摄像头快照作为 WriteableBitmap 类型提供给我。然后我尝试将其转换为 byte[] 数组,然后再将其发送到 MVC。它已成功保存到数据库,但是当我尝试将其从数据库中拉出并显示时,它似乎不是有效的图像。我的转换代码是否存在问题?或者也许我可以将它作为图像类型发送,或者我只能通过这样的 http 帖子发送字节 [] 数组?

在我的 Silverlight 应用程序中:

    private void SendImage()
    {
        var client = new WebClient();
        var uri = new Uri("http://localhost:4600/GuestBadge/GetCameraImage");
        client.OpenWriteCompleted += (sender, e) =>
        {
            var buffer = (byte[])e.UserState;
            e.Result.Write(buffer, 0, buffer.Length);
            e.Result.Close();
        };
        client.OpenWriteAsync(uri, "POST", ToByteArray(SnapShot));
    }

    public static byte[] ToByteArray(WriteableBitmap bmp)
    {
        // Init buffer
        int w = bmp.PixelWidth;
        int h = bmp.PixelHeight;
        int[] p = bmp.Pixels;
        int len = p.Length;
        byte[] result = new byte[4 * w * h];

        // Copy pixels to buffer
        for (int i = 0, j = 0; i < len; i++, j += 4)
        {
            int color = p[i];
            result[j + 0] = (byte)(color >> 24); // A
            result[j + 1] = (byte)(color >> 16); // R
            result[j + 2] = (byte)(color >> 8);  // G
            result[j + 3] = (byte)(color);       // B
        }

        return result;
    }

在我的控制器中:

    [HttpPost]
    public ActionResult GetCameraImage()
    {
        byte[] image = new byte[Request.InputStream.Length];
        Request.InputStream.Read(image, 0, image.Length);
        var getPerson = (from a in db.Persons where a.PersonID == 3 select a).FirstOrDefault();
        getPerson.Picture = image;
        db.SaveChanges();
        return null;
    }
于 2012-09-19T23:41:19.050 回答
0

我最终使用 FJCore http://code.google.com/p/fjcore/将我的 WriteableBitmap 编码为 JPEG,然后使用我在此问题中找到的代码将其转换为 BASE64 Using FJCore to encode Silverlight WriteableBitmap谢谢!。然后依次将其转换为 byte[] 数组并使用您的代码将其发送到 MVC,现在它工作得很好。我对所有这些东西都很陌生,以前对编码过程还不太了解。下面是我用于此的代码。再次感谢您的帮助!

    private static string GetBase64Jpg(WriteableBitmap bitmap)
    {
        int width = bitmap.PixelWidth;
        int height = bitmap.PixelHeight;
        int bands = 3;
        byte[][,] raster = new byte[bands][,];

        for (int i = 0; i < bands; i++)
        {
            raster[i] = new byte[width, height];
        }

        for (int row = 0; row < height; row++)
        {
            for (int column = 0; column < width; column++)
            {
                int pixel = bitmap.Pixels[width * row + column];
                raster[0][column, row] = (byte)(pixel >> 16);
                raster[1][column, row] = (byte)(pixel >> 8);
                raster[2][column, row] = (byte)pixel;
            }
        }

        ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
        FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);
        MemoryStream stream = new MemoryStream();
        JpegEncoder encoder = new JpegEncoder(img, 90, stream);
        encoder.Encode();

        stream.Seek(0, SeekOrigin.Begin);
        byte[] binaryData = new Byte[stream.Length];
        long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);

        string base64String =
                System.Convert.ToBase64String(binaryData,
                                              0,
                                              binaryData.Length);

        return base64String;
    }


    private void SendImage()
    {
        var client = new WebClient();
        var uri = new Uri("http://localhost:4600/GuestBadge/GetCameraImage");
        client.OpenWriteCompleted += (sender, e) =>
        {
            var buffer = (byte[])e.UserState;
            e.Result.Write(buffer, 0, buffer.Length);
            e.Result.Close();
        };
        client.OpenWriteAsync(uri, "POST", Convert.FromBase64String(GetBase64Jpg(SnapShot)));
    }
于 2012-09-20T18:00:33.890 回答