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

5 minutos de lectura

¿Como cambiar el tamano de un mapa de bits en
Excepción de puntero nulo

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)
);

profileImage es mi ImageView

Ok, pero tengo que cambiar el tamaño de esta imagen antes de mostrarla en mi ImageView de mi diseño. Tengo que cambiar el tamaño a 120×120.

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

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

  • Posible duplicado de Cambiar tamaño de mapa de bits en Android

    – Sagar Pilkwal

    10 de mayo de 2016 a las 6:03

  • @SagarPilkhwal a este se le preguntó primero

    – 김선달

    1 de agosto de 2020 a las 12:32

1646961488 612 ¿Como cambiar el tamano de un mapa de bits en
usuario432209

Cambiar:

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

Para:

Bitmap b = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));

  • supongamos que tiene una imagen de gran resolución, digamos 1200×1200 y cuando la muestre, estará completa en la vista de imagen. Si reduzco la escala, digamos un 75 %, y la pantalla muestra una imagen escalada también completamente en la vista de imagen, ¿qué se debe hacer para esas pantallas?

    – jxgn

    4 de enero de 2013 a las 8:54

  • El createScaledBitmap arroja una excepción de falta de memoria en mi Galaxy Tab2, lo cual es muy extraño para mí, ya que hay mucha memoria y no se está ejecutando ninguna otra aplicación en particular. Sin embargo, la solución Matrix funciona.

    – Ludovico

    21 de marzo de 2013 a las 6:11

  • ¿y si queremos guardar la relación de aspecto?

    – Los errores suceden

    20 de enero de 2015 a las 14:46

  • ¿Qué pasa con la escala de dpi para esto? Creo que el mapa de bits escalado debe basarse en la altura y el ancho de la pantalla del dispositivo.

    –Doug Ray

    02/02/2016 a las 19:35

  • El uso de Bitmap.createScaledBitmap() para reducir una imagen a más de la mitad del tamaño original puede producir artefactos de alias. Puedes echar un vistazo a un correo Escribí donde propongo algunas alternativas y comparo calidad y rendimiento.

    – Petrakeas

    9 de noviembre de 2017 a las 13:36

¿Como cambiar el tamano de un mapa de bits en
jeet.chanchawat

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: según lo sugerido por @aveschini, he agregado 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.

  • Probé bitmap.createscaledbitmap y este enfoque matricial. Encuentro que la imagen es mucho más clara con el enfoque matricial. No sé si es común o simplemente porque estoy usando un simulador en lugar de un teléfono. Solo una pista para alguien que se encuentra con el mismo problema que yo.

    –Anson Yao

    18 de noviembre de 2014 a las 4:47

  • aquí también debe agregar bm.recycle () para obtener un rendimiento de memoria mucho mejor

    – aveschini

    22 de enero de 2015 a las 14:22

  • Gracias por la solución, pero sería mejor que se reordenaran los parámetros; public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight). Pasé un infierno de tiempo resolviéndolo. ;PAGS

    – Ataque

    2 de marzo de 2015 a las 5:33

  • Tenga en cuenta que la importación correcta para Matrix es android.graphics.Matrix.

    – Lev

    19 de enero de 2017 a las 10:05

  • Esto es lo mismo que llamar a Bitmap.createScaledBitmap(). Ver android.googlesource.com/platform/frameworks/base/+/refs/heads/…

    – BamsBamx

    07/03/2017 a las 21:50


1646961489 420 ¿Como cambiar el tamano de un mapa de bits en
ZenBalance

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

Bitmap originalBitmap = <original initialization>;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(
    originalBitmap, newWidth, newHeight, false);

  • @beginner si cambia el tamaño de la imagen, es posible que esté escalando en función de diferentes dimensiones que transforman el mapa de bits en proporciones incorrectas o eliminan parte de la información del mapa de bits.

    – ZenBalance

    4 de diciembre de 2016 a las 9:23

  • Intenté cambiar el tamaño del mapa de bits según las proporciones, pero luego recibí este error. Causado por: java.lang.RuntimeException: Canvas: tratando de usar un mapa de bits reciclado android.graphics.Bitmap@2291dd13

    – principiante

    5 de diciembre de 2016 a las 7:57

  • @principiante cada vez que cambie el tamaño del mapa de bits, dependiendo de lo que esté haciendo, normalmente necesitará crear una copia que tenga un tamaño nuevo, en lugar de cambiar el tamaño del mapa de bits existente (ya que en este caso parece que la referencia al mapa de bits era ya reciclado en memoria).

    – ZenBalance

    5 de diciembre de 2016 a las 10:48

  • correcto… lo probé y ahora funciona. Gracias

    – principiante

    6 de diciembre de 2016 a las 5:12

1646961490 958 ¿Como cambiar el tamano de un mapa de bits en
Renato Probst

Escala basada en 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áximo de destino, 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);

¿Como definir una forma de circulo en un archivo dibujable
Ravi Makvana

prueba este este código:

BitmapDrawable drawable = (BitmapDrawable) imgview.getDrawable();
Bitmap bmp = drawable.getBitmap();
Bitmap b = Bitmap.createScaledBitmap(bmp, 120, 120, false);

Espero que sea útil.

1646961491 412 ¿Como cambiar el tamano de un mapa de bits en
Comunidad

Alguien preguntó cómo mantener la relación de aspecto en esta situación:

Calcule el factor que está usando para escalar y utilícelo para ambas dimensiones. Digamos que quieres que una imagen tenga el 20% de la altura de la pantalla

int scaleToUse = 20; // this will be our percentage
Bitmap bmp = BitmapFactory.decodeResource(
    context.getResources(), R.drawable.mypng);
int sizeY = screenResolution.y * scaleToUse / 100;
int sizeX = bmp.getWidth() * sizeY / bmp.getHeight();
Bitmap scaled = Bitmap.createScaledBitmap(bmp, sizeX, sizeY, false);

para obtener la resolución de la pantalla, tiene esta solución: obtenga las dimensiones de la pantalla en píxeles

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad