Tuesday, 15 March 2016

Bitmap out of memory

Hello friends if you face bitmap  memory out of bound problem then use this method i hope resolve your problem.


First Logic




private void optimizeMemory(String files) throws FileNotFoundException {
    Bitmap bitmap;
    try {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        FileInputStream fis = new FileInputStream(files);
        BitmapFactory.decodeStream(fis, null, options);
        fis.close();
        final int REQUIRED_SIZE = 270;
        int width_tmp = options.outWidth, height_tmp = options.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }
        BitmapFactory.Options op = new BitmapFactory.Options();
        op.inSampleSize = scale;
        fis = new FileInputStream(files);
        bitmap = BitmapFactory.decodeStream(fis, null, op);
        captureFrame(bitmap);
        Log.e("FileOp","Optimization "+bitmap.getHeight());
        fis.close();
    }catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }catch (IOException e)
    {
        e.printStackTrace();
    }
}

private void showImage(Bitmap bitmap) {

        AlertDialog.Builder myCaptureDialog =
                new AlertDialog.Builder(MainActivity.this);
        ImageView capturedImageView = new ImageView(MainActivity.this);
        capturedImageView.setImageBitmap(bitmap);
        ViewGroup.LayoutParams capturedImageViewLayoutParams =
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,                 ViewGroup.LayoutParams.WRAP_CONTENT);
        capturedImageView.setLayoutParams(capturedImageViewLayoutParams);

        myCaptureDialog.setView(capturedImageView);
        myCaptureDialog.show();


}

Second Logic


private Bitmap decodeSampledBitmap(String pathName,int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
   
final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(pathName, options);

    // Calculate inSampleSize
   
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
   
options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(pathName, options);
}

//I added this to have a good approximation of the screen size:
private Bitmap decodeSampledBitmap(String pathName) {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
    return decodeSampledBitmap(pathName, width, height);
}

private int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
   
final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
       
while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

I hope resolve your problem.




No comments:

Post a Comment