Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sampling a bitmap from url

Tags:

android

I am trying to reduce the size of bitmap from a url. I saw many posts, but all were about sampling a local file. I want to sample the image at url. Here is my code:

public Bitmap getScaledFromUrl(String url) {
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1 / 10;
    try {
        return BitmapFactory.decodeStream((InputStream) new URL(url)
                .getContent());
    } catch (MalformedURLException e) {
        e.printStackTrace();
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Is this approach correct? I am getting out of memory crashes in my app at this function. Any ideas?

like image 530
berserk Avatar asked May 09 '26 00:05

berserk


2 Answers

This works. I found it at http://blog.vandzi.com/2013/01/get-scaled-image-from-url-in-android.html . Use the following snippet of code, pass params as you like.

private static Bitmap getScaledBitmapFromUrl(String imageUrl, int requiredWidth, int requiredHeight) throws IOException {
    URL url = new URL(imageUrl);
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options);
    options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);
    options.inJustDecodeBounds = false;
    //don't use same inputstream object as in decodestream above. It will not work because 
    //decode stream edit input stream. So if you create 
    //InputStream is =url.openConnection().getInputStream(); and you use this in  decodeStream
    //above and bellow it will not work!
    Bitmap bm = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options);
    return bm;
}

private static 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) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

It's really flexible.. I think you should try it out.

like image 179
Parth Sane Avatar answered May 10 '26 16:05

Parth Sane


You are using it wrong. You are asking to make the picture 10 times bigger :) You should give the command in normal numbers, not fraction. For example:

    final BitmapFactory.Options options2 = new BitmapFactory.Options();
    options2.inSampleSize = 8;
    b = BitmapFactory.decodeFile(image, options2);

with this configuration you obtain 8 times smaller picture than the original.

UPDATE: To load image from internet add this class to the project and do the following:

ImageLoader loader = new ImageLoader(context);
Bitmap image = loader.getBitmap(URL);
like image 29
NiVeR Avatar answered May 10 '26 16:05

NiVeR



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!