0

私の質問は、バイト配列をビットマップにデコードするときにメモリ不足エラーを処理して、ローテーションを実行できるようにする方法です。私のコードは次のとおりです。重複していると言う前に、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();
        }
    }
4

2 に答える 2

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();
于 2012-11-16T23:24:03.233 に答える
0

なにrotatedPicture.Dispose()?これは参照をnullに設定するだけですか?ビットマップのメモリを削除する最善かつ最速の方法は、recycle()メソッドを使用することです。

于 2012-11-14T15:14:39.470 に答える