L.Grillo
L.Grillo

Reputation: 981

NullPointerException rescaling bitmap from file Android

I'm facing this problem since a month with no solution: I need to convert a file into a bitmap and rescaling it. I'm using the following method, taken from android guide: Loading Large Bitmaps Efficiently

public Bitmap decodeSampledBitmapFromFile(String path, int reqSize) {

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

    // Calculate inSampleSize               
    double ratio = (double) options.outHeight / options.outWidth;
    boolean portrait = true;
    if (ratio < 1) {
        portrait = false;
    }

    double floatSampleSize = options.outHeight / (double)reqSize;
    options.inSampleSize = (int) Math.floor(floatSampleSize);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;     
    Bitmap resultBitmap = BitmapFactory.decodeFile(path, options);

    if(floatSampleSize % options.inSampleSize != 0){
        if(portrait) {
            resultBitmap = Bitmap.createScaledBitmap(resultBitmap, (int)(reqSize/ratio), reqSize, true);                
        } else {
            resultBitmap = Bitmap.createScaledBitmap(resultBitmap, reqSize, (int)(ratio*reqSize), true);                
        }
    }

    return resultBitmap;
}

I've got the same NullPointerException but i can't reproduce it:

NullPointerException (@Utilities:decodeSampledBitmapFromFile:397) {AsyncTask #2}
NullPointerException (@Utilities:decodeSampledBitmapFromFile:399) {AsyncTask #3}

lines 397 and 399 are:

resultBitmap = Bitmap.createScaledBitmap(resultBitmap, (int)(reqSize/ratio), reqSize, true);
resultBitmap = Bitmap.createScaledBitmap(resultBitmap, reqSize, (int)(ratio*reqSize), true);

in this device models:

ST21a
U9500
M7
U8950-1

GT-I9305

Someone can help me to solve this? is BitmapFactory.decodeFile returns null? thank you so much

Upvotes: 1

Views: 245

Answers (1)

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Try this hope works for you

public Bitmap decodeFile(String path, int reqSize) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = reqSize;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeFile(path, o2);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;

    }

Upvotes: 1

Related Questions