Alex Rivera | Logout

Optimal use of BitmapFactory.Options.inSampleSize for speed

Asked 2011-01-28T05:39:08.400
24

Thanks to Schermvlieger for asking this question on anddev.org,

I'm just copying his question to SO as nobody replied on the other site and I'm also facing the same problem.

I was wondering what would be the optimal use of BitmapFactory.Options.inSampleSize with regards to speed of displaying the image.
The documentation mentions using values that are a power of 2, so I am working with 2, 4, 8, 16 etc.

The things I am wondering about are:

  1. Should I resample down to the smallest size that is still larger than the screen resolution, or should I sample down to the size just enough to avoid an OutOfMemoryError?
  2. How would one calculate the maximum size of an image that could still be displayed without running out of memory? Does the color-depth of the image play a role as well, and the depth of the display?
  3. Is it efficient to display images via two mechanisms (BitmapFactory for large files, setImageURI() for smaller ones) I am using an ImageSwitcher by the way.
  4. Would it help creating the Bitmap, BitmapFactory.Options and inTempStorage in the beginning of the application or creating them only on the fly, when needed?
Edit
Report

1 Answer

4

You've asked good questions , but it all depends on your needs and how much memory you use. I recommend checking out this link for many tips regarding bitmaps: http://developer.android.com/training/displaying-bitmaps/index.html .

In short , you should consider caching , downsampling , and using a good-enough bitmap format whenever you can.

Here's my answers to your questions:

  1. Why not both? if you think there might be OOM , try to recycle old,unused bitmaps and then check again .

  2. you can calculate the (estimated) size of the bitmap :

    width*height*bytesPerPixel

    where bytesPerPixel is usually 4 or 2 (depending on the bitmap format) .

  3. Never used setImageURI , so I can't help you with that. I suggest downloading images in a background thread (using asyncTask is one way to do so) and showing them when it's ready.

  4. If there are only a few that you know that won't take a lot of the memory , i guess it's ok. I still think caching could be better.

answered 2013-02-09T12:13:08.117

Your Answer