Headertab

Drop Down MenusCSS Drop Down MenuPure CSS Dropdown Menu

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