Home » Android » android – outofmemoryerror while making bitmap

android – outofmemoryerror while making bitmap

Posted by: admin June 15, 2020 Leave a comment

Questions:

I am making the camer application which can composite the camera preview and png.

I would like to save the images in onPictureTaken callback

my source is below

    public void onPictureTaken(byte[] data, Camera camera) {

            //preview from camera
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

            // overlay image 
            Bitmap overlayBmp = overlay.getDrawingCache(); 

            //blank beatmap 
            Bitmap blankBitmap = 
            Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), 
            Bitmap.Config.ARGB_8888); 

            //make canvas
            Canvas canvas = new Canvas(blankBitmap); 

            //composite image
            canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(), 
    bitmap.getHeight()), null); 
            canvas.drawBitmap(overlayBmp, null,new Rect(0, 0, bitmap.getWidth(), 
    bitmap.getHeight()), null); 

However it shows outofmemoryerror,how can I solve this problem..?

05-20 15:13:49.114: E/AndroidRuntime(31647): FATAL EXCEPTION: main
05-20 15:13:49.114: E/AndroidRuntime(31647): java.lang.OutOfMemoryError
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.graphics.Bitmap.nativeCreate(Native Method)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at com.example.firstcameraappli.MainActivity$2.onPictureTaken(MainActivity.java:103)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:750)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at      android.os.Looper.loop(Looper.java:137)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at android.app.ActivityThread.main(ActivityThread.java:4514)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at java.lang.reflect.Method.invokeNative(Native Method)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at java.lang.reflect.Method.invoke(Method.java:511)
05-20 15:13:49.114: E/AndroidRuntime(31647):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
How to&Answers:

Try this code….

PictureCallback myPictureCallback_JPG = new PictureCallback()
{

    @Override
    public void onPictureTaken(byte[] data, Camera arg1) {

        BitmapFactory.Options opt;

        opt = new BitmapFactory.Options();
        opt.inTempStorage = new byte[16 * 1024];
        Parameters parameters = arg1.getParameters();
        Size size = parameters.getPictureSize();

        int height11 = size.height;
        int width11 = size.width;
        float mb = (width11 * height11) / 1024000;

        if (mb > 4f)
            opt.inSampleSize = 4;
        else if (mb > 3f)
            opt.inSampleSize = 2;

        //preview from camera
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); 


    }
}

get image in bitmap then you use as per your requirements.

Answer:

This is a well known issue on Android. The problem is that manipulating bitmaps requires more memory than is available in most devices. You can use certain tricks however. Some discussions and solutions to help you:

Answer:

if you want to save image to sdcard, try like this

public void onPictureTaken(byte[] data, Camera camera) {
            camera.startPreview();
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream(
                        "/mnt/sdcard/mypicture.png");
                outStream.write(data);
                outStream.close();
                Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
            } catch (FileNotFoundException e) {
                e.printStackTrace();

            } catch (IOException e) {
                e.printStackTrace();
            } finally {

            }

        }