Android 从相机加载单个位图时如何处理内存不足错误

Android 从相机加载单个位图时如何处理内存不足错误,android,bitmap,camera,xamarin.android,out-of-memory,Android,Bitmap,Camera,Xamarin.android,Out Of Memory,我的问题是,在将字节数组解码为位图时,如何处理内存不足错误,以便对其进行旋转。我的代码如下所示,在您说它是一个副本之前,我已经尝试使用BitmapFactory.Options并将样本大小设置为2。然而,质量损失太严重,令人难以接受。此外,它似乎只发生在一台设备上,因此可能是一次性的,但我倾向于相信,如果它影响一台设备,以后还会有25台类似的设备。这也发生在第一张拍摄的照片上,这是本活动针对位图所做的唯一工作。当我在Monodroid中工作时,Java答案也很受欢迎,因为我通常可以相当容易地将它

我的问题是,在将字节数组解码为位图时,如何处理内存不足错误,以便对其进行旋转。我的代码如下所示,在您说它是一个副本之前,我已经尝试使用BitmapFactory.Options并将样本大小设置为2。然而,质量损失太严重,令人难以接受。此外,它似乎只发生在一台设备上,因此可能是一次性的,但我倾向于相信,如果它影响一台设备,以后还会有25台类似的设备。这也发生在第一张拍摄的照片上,这是本活动针对位图所做的唯一工作。当我在Monodroid中工作时,Java答案也很受欢迎,因为我通常可以相当容易地将它们翻译成C

public void GotImage(byte[] image)
    {
        try
        {
            Android.Graphics.Bitmap thePicture = Android.Graphics.BitmapFactory.DecodeByteArray(image, 0, image.Length);
            Array.Clear(image, 0, image.Length);
            image = null;
            GC.Collect();
            Android.Graphics.Matrix m = new Android.Graphics.Matrix();
            m.PostRotate(90);
            Android.Graphics.Bitmap rotatedPicture = Android.Graphics.Bitmap.CreateBitmap(thePicture, 0, 0, thePicture.Width, thePicture.Height, m, true);
            thePicture.Dispose();
            thePicture = null;
            GC.Collect();

            using (MemoryStream ms = new MemoryStream())
            {
                rotatedPicture.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, ms);
                image = ms.ToArray();
            }
            rotatedPicture.Dispose();
            rotatedPicture = null;
            GC.Collect();

            listOfImages.Add(image);
            storeButton.Text = "  Store " + listOfImages.Count + " Pages  ";
            storeButton.Enabled = true;
            takePicButton.Enabled = true;
            gotImage = false;
            cameraPreviewArea.camera.StartPreview();
        }
        catch (Exception ex)
        {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
            alertDialog.SetTitle("Error Taking Picture");
            alertDialog.SetMessage(ex.ToString());
            alertDialog.SetPositiveButton("OK", delegate { });
            alertDialog.Show();
        }
    }

什么是旋转的picture.Dispose()?这只是将引用设置为null吗?去除位图内存的最好和最快的方法是通过该方法。

经过一天的学习,我发现了一个解决方法。这涉及到在拍摄照片之前设置相机拍摄的照片的分辨率,而不是在拍摄后尝试缩放。我还在“设置”中设置选项,让用户尝试不同的分辨率,直到获得最适合自己的分辨率

Camera.Parameters parameters = camera.GetParameters();
parameters.SetPictureSize(parameters.SupportedPictureSizes[parameters.SupportedPictureSizes.Count - 1].Width,
                    parameters.SupportedPictureSizes[parameters.SupportedPictureSizes.Count - 1].Height);
camera.SetParameters(parameters);
camera.StartPreview();

作为第一步,我将尝试通过将其分解为多个方法(解码/旋转/压缩)来帮助GC,允许每个步骤的过渡位图/数组超出范围。由于某种原因,
GC.Collect()。您可以从中获取缩略图,它可能会使用更好的缩放算法。调用Dispose()应该完成recycle()所做的一切,但我也可以尝试recycle,以查看结果。作为提醒,我刚刚解决了这个问题,详细的解决方案即将出台。