0

Silverlightアプリケーションを含むJavaScriptで新しいウィンドウを開く写真を撮るためのボタンを備えたMVC 4アプリケーションがあります。Silverlight アプリケーションは、Web カメラを使用して写真を撮り、それを書き込み可能なビットマップとして保存できます。私がやりたいことは、そのビットマップをコントローラーのアクションにプッシュして、データベースに保存し、ビューを更新することです。

画像を投稿としてコントローラーに送信する必要があることはわかっていますが、それを行う方法に関するコード例や提案は大歓迎です。次のように動作するはずです。Silverlight アプリケーションに画像を保存するためのボタン クリックは、MVC コントローラーに POST を呼び出し、画像ストリームをパラメーターとしてコントローラーにアタッチし、コントローラーはストリームを取得してプッシュアップできます。データベースに接続したら、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は、WebカメラのスナップショットをWriteableBitmapタイプとして提供します。次に、MVCに送信する前にbyte[]配列に変換しようとしました。データベースに正常に保存されていますが、データベースから引き出して表示しようとすると、有効な画像ではないようです。私の変換コードで見られる問題はありますか?または、画像タイプとして送信できますか、またはこのようなhttp投稿を介してbyte []配列のみを送信できますか?

私の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 に変換しました。次に、それを 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 に答える