I have an Android application that is very image intensive. I'm currently using Bitmap.createScaledBitmap()
to scale the image to a desired size. However, this method requires that I already have the original bitmap in memory, which can be quite sizable.
How can I scale a bitmap that I'm downloading without first writing the entire thing out to local memory or file system?
This method will read the header information from the image to determine its size, then read the image and scale it to the desired size in place without allocating memory for the full original sized image.
It also uses BitmapFactory.Options.inPurgeable, which seems to be a sparsely documented but desirable option to prevent OoM exceptions when using lots of bitmaps. UPDATE: no longer uses inPurgeable, see this note from Romain
It works by using a BufferedInputStream to read the header information for the image before reading the entire image in via the InputStream.
Here is my version, based on @emmby solution (thanks man!) I've included a second phase where you take the reduced bitmap and scale it again to match exactly your desired dimensions. My version takes a file path rather than a stream.