Повреждение изображения при сохранении изображений на Xamarin - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь создать приложение для съемки фотографий, проблема заключается в том, что я пытаюсь сохранить изображение во внутренней папке приложения. Некоторые изображения хороши, а другие испорчены следующим образом:

https://i.stack.imgur.com/8M81x.jpg

https://i.stack.imgur.com/McIa4.jpg

Первые имеют ошибка / секунда в порядке

И это мой код, который я использую:

   class CameraPictureCallback : Java.Lang.Object, Camera.IPictureCallback
{
    const string APP_NAME = "CameraApp";
    Context _context;

    public CameraPictureCallback(Context context)
    {
        _context = context;
    }

    public void OnPictureTaken(byte[] data, Camera camera)
    {
        var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures) + "/XFRecognition";
        try
        {
            Toast.MakeText(_context, "test click", ToastLength.Short).Show();
            string fileName = "test.jpg";

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            using (var fileOutputStream = new FileOutputStream(System.IO.Path.Combine(dir,fileName)))
            {
                 fileOutputStream.Write(data);
            }

            camera.StartPreview();
        }
        catch (System.Exception e)
        {
            Log.Debug(APP_NAME, "File not found: " + e.Message);
        }

    }

}

Есть идеи для проблемы?

1 Ответ

0 голосов
/ 26 февраля 2020

Вы можете использовать плагин Xam.Plugin.Media из nuget. Который может делать фотографии и видео или выбирать их из галереи.

   private async void ButtonClick(object sender, EventArgs eventArgs)
    {
        await CrossMedia.Current.Initialize();
        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            //"No Camera Available"
            return;
        }

        var file = await CrossMedia.Current.TakePhotoAsync(
        new StoreCameraMediaOptions
        {
            SaveToAlbum = true,
        //Directory = "Sample",
        //Name = "Test.jpg"
    });

        if (file == null)
            return;

        var imgDate = GetImageStreamAsBytes(file.GetStream());


        // save it to folder
    }

И преобразовывать его в байтовый массив

public byte[] GetImageStreamAsBytes(Stream input)
    {
        var buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }

Более подробную информацию о плагине вы можете проверить https://github.com/jamesmontemagno/MediaPlugin

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