私の質問は、バイト配列をビットマップにデコードするときにメモリ不足エラーを処理して、ローテーションを実行できるようにする方法です。私のコードは次のとおりです。重複していると言う前に、BitmapFactory.Options を使用してサンプル サイズを 2 に設定してみました。また、それは 1 つのデバイスでのみ発生しているように見えるので、1 回限りのことかもしれませんが、1 つに影響する場合は、後で同様のものが 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();
}
}