Передать Camera OnActivityResult в веб-сервис для сохранения на сервере в виде изображения - PullRequest
1 голос
/ 17 января 2012

Итак, я дошел до того, чтобы заставить камеру открыться, сделать снимок и затем вернуть результат с камеры следующим образом:

bt.Click += delegate
   {
      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
      StartActivityForResult(intent, 0);
   };
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode == Result.Ok && requestCode == 0)
        {
            string result = data.ToURI();            
        }

Значение результата заканчивается как "#Intent; action= рядные данные; B.bitmap-данные = истина, конец».Я действительно не знаю, куда идти дальше, если взять результат изображения и иметь возможность передать его моему веб-сервису, который затем сохранит его в виде файла изображения на сервере.

Редактировать: окончательный код для тех, у кого такая же проблема

bt.Click += delegate
   {
  Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
  StartActivityForResult(intent, 0);
  };
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
 {
    Bitmap bitmap = (Android.Graphics.Bitmap)data.Extras.Get("data");

    using (var stream = new System.IO.MemoryStream())
    {
      bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, stream);
      byte[] imageBytes = stream.ToArray();
      string base64String = Convert.ToBase64String(imageBytes);

      inst.saveImage(base64String);
    }
 }
    [WebMethod]
    public void saveImage(string stream)
    {
        byte[] imageBytes = Convert.FromBase64String(stream);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);
        var filepath = "C:\\Temp\\Test.png";

        using (Stream file = File.OpenWrite(filepath))
        {
            ms.CopyTo(file, (int)stream.Length);
        }

    }

1 Ответ

1 голос
/ 17 января 2012

Данные, которые вы получаете, включают в себя данные растрового изображения, как показывает ваша строка «result». Вы можете извлечь растровое изображение из намерения и сжать его в поток, выполнив что-то вроде этого:

var bitmap = (Android.Graphics.Bitmap) data.Extras.Get("data");

using (var stream = new MemoryStream())
{
    bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, stream);

    // stream now contains the image data
}

Вы можете использовать любой тип потока .NET там, поэтому MemoryStream - только пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...