我的问题是如何在将字节数组解码为位图时处理Out of Memory错误,以便我可以对其进行旋转。我的代码如下,在您说它的副本之前,我尝试使用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();
}
}
答案 0 :(得分:0)
什么是rotatedPicture.Dispose()
?这只是将引用设置为null吗?摆脱Bitmap内存的最佳和最快捷的方法是使用recycle()方法。
答案 1 :(得分:0)
经过漫长的一天学习后,我发现了修复/解决方法。这涉及在拍摄照片之前设置照相机拍摄的照片的分辨率,而不是在事实之后尝试缩放照片。我还在设置中设置选项,以便用户尝试不同的分辨率,直到他们得到最适合他们的分辨率。
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();