【问题标题】:Image corruption while saving pictures on Xamarin在 Xamarin 上保存图片时图像损坏
【发布时间】:2020-06-09 19:47:20
【问题描述】:

我正在尝试创建一个应用来拍照,但问题是当我尝试将图片保存在应用的内部文件夹中时。有些图片很好,有些像这样损坏:

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);
        }

    }

}

对这个问题有什么想法吗?

【问题讨论】:

  • 你收到错误信息了吗?
  • @LucasZhang-MSFT 实际上我没有收到错误,但有些图片保存已损坏。奇怪的是,如果我在保存图片的文件夹中手动搜索并出于某种原因将损坏图片的名称更改为其他名称图片没问题,我的意思是它看起来像其他没有黑屏或矩形的图片一样正常图片的一半。

标签: c# android image xamarin


【解决方案1】:

您可以使用来自 nuget 的插件 Xam.Plugin.Media。它可以拍摄照片和视频或从图库中挑选它们。

   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

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2023-03-19
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多