我的问题是如何在将字节数组解码为位图时处理内存不足错误,以便我可以对其进行旋转。我的代码如下,在你说它重复之前,我已经尝试使用 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();
}
}