¿Cómo cambiar el tamaño de un mapa de bits en Android?

Resuelto NullPointerException asked hace 54 años • 21 respuestas

Tengo un mapa de bits tomado de una cadena Base64 de mi base de datos remota ( encodedImagees la cadena que representa la imagen con Base64):

profileImage = (ImageView)findViewById(R.id.profileImage);

byte[] imageAsBytes=null;
try {
    imageAsBytes = Base64.decode(encodedImage.getBytes());
} catch (IOException e) {e.printStackTrace();}

profileImage.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
);

perfilImage es mi ImageView

Ok, pero tengo que cambiar el tamaño de esta imagen antes de mostrarla en mi ImageViewdiseño. Tengo que cambiar su tamaño a 120x120.

¿Alguien puede decirme el código para cambiar su tamaño?

Los ejemplos que encontré no se pudieron aplicar a un mapa de bits obtenido de una cadena base64.

NullPointerException avatar Jan 01 '70 08:01 NullPointerException
Aceptado

Cambiar:

profileImage.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)

A:

Bitmap b = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));
user432209 avatar Jan 29 '2011 15:01 user432209
import android.graphics.Matrix
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // CREATE A MATRIX FOR THE MANIPULATION
    Matrix matrix = new Matrix();
    // RESIZE THE BIT MAP
    matrix.postScale(scaleWidth, scaleHeight);

    // "RECREATE" THE NEW BITMAP
    Bitmap resizedBitmap = Bitmap.createBitmap(
        bm, 0, 0, width, height, matrix, false);
    bm.recycle();
    return resizedBitmap;
}

EDITAR: como lo sugirió @aveschini, lo agregué bm.recycle();para evitar pérdidas de memoria. Tenga en cuenta que, en caso de que esté utilizando el objeto anterior para otros fines, manéjelo en consecuencia.

jeet.chanchawat avatar May 22 '2012 13:05 jeet.chanchawat

Si ya tiene un mapa de bits, puede usar el siguiente código para cambiar su tamaño:

Bitmap originalBitmap = <original initialization>;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(
    originalBitmap, newWidth, newHeight, false);
ZenBalance avatar Nov 12 '2012 21:11 ZenBalance

Escala basada en la relación de aspecto :

float aspectRatio = yourSelectedImage.getWidth() / 
    (float) yourSelectedImage.getHeight();
int width = 480;
int height = Math.round(width / aspectRatio);

yourSelectedImage = Bitmap.createScaledBitmap(
    yourSelectedImage, width, height, false);

Para usar la altura como base en lugar del ancho, cambie a:

int height = 480;
int width = Math.round(height * aspectRatio);
Renato Probst avatar Mar 07 '2015 23:03 Renato Probst

Escale un mapa de bits con un tamaño y ancho máximos objetivo, manteniendo la relación de aspecto:

int maxHeight = 2000;
int maxWidth = 2000;    
float scale = Math.min(((float)maxHeight / bitmap.getWidth()), ((float)maxWidth / bitmap.getHeight()));

Matrix matrix = new Matrix();
matrix.postScale(scale, scale);

bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Kevin avatar Jun 03 '2015 01:06 Kevin