Decodificar mapas de bits en Android con el tamaño correcto

Decodifico mapas de bits de la tarjeta SD usandoBitmapFactory.decodeFile. A veces, los mapas de bits son más grandes de lo que necesita la aplicación o lo que permite el montón, por lo que utilizoBitmapFactory.Options.inSampleSize para solicitar un mapa de bits submuestreado (más pequeño).

El problema es que la plataforma no aplica el valor exacto de inSampleSize, y a veces termino con un mapa de bits demasiado pequeño o demasiado grande para la memoria disponible.

Dehttp://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize:

Nota: el decodificador intentará cumplir con esta solicitud, pero el mapa de bits resultante puede tener diferentes dimensiones que precisamente lo solicitado. Además, los poderes de 2 a menudo son más rápidos / fáciles de cumplir para el decodificador.

¿Cómo debo decodificar mapas de bits de la tarjeta SD para obtener un mapa de bits del tamaño exacto que necesito y consumir la menor cantidad de memoria posible para decodificarlo?

Editar:

Código fuente actual:

BitmapFactory.Options bounds = new BitmapFactory.Options();
this.bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bounds);
if (bounds.outWidth == -1) { // TODO: Error }
int width = bounds.outWidth;
int height = bounds.outHeight;
boolean withinBounds = width <= maxWidth && height <= maxHeight;
if (!withinBounds) {
    int newWidth = calculateNewWidth(int width, int height);
    float sampleSizeF = (float) width / (float) newWidth;
    int sampleSize = Math.round(sampleSizeF);
    BitmapFactory.Options resample = new BitmapFactory.Options();
    resample.inSampleSize = sampleSize;
    bitmap = BitmapFactory.decodeFile(filePath, resample);
}

Respuestas a la pregunta(10)

Su respuesta a la pregunta