¿Cómo cambiar el tamaño de un mapa de bits en Android?
Tengo un mapa de bits tomado de una cadena Base64 de mi base de datos remota ( encodedImage
es 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 ImageView
diseñ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.
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));
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.
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);
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);
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);