C# 在Xamarin上保存图片时图像损坏

C# 在Xamarin上保存图片时图像损坏,c#,android,image,xamarin,C#,Android,Image,Xamarin,我正在尝试创建一个用于拍照的应用程序问题是当我尝试将图片保存在应用程序的内部文件夹中时。一些图片很好,另一些图片损坏如下: 第一个有错误/第二个没问题 这是我正在使用的代码: class CameraPictureCallback : Java.Lang.Object, Camera.IPictureCallback { const string APP_NAME = "CameraApp"; Context _context; public CameraPi

我正在尝试创建一个用于拍照的应用程序问题是当我尝试将图片保存在应用程序的内部文件夹中时。一些图片很好,另一些图片损坏如下:

第一个有错误/第二个没问题

这是我正在使用的代码:

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

    }

}

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

你可以使用nuget提供的pluginXam.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();
        }
    }

有关该插件的更多详细信息,请查看,您可以使用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();
        }
    }

有关该插件的更多详细信息,请查看

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