Saltar al contenido

Reducir el tamaño de un mapa de bits a un tamaño específico en Android

Comprende el código correctamente previamente a utilizarlo a tu trabajo si tdeseas aportar algo puedes compartirlo con nosotros.

Solución:

Encontré una respuesta que funciona perfectamente para mí:

/**
 * reduces the size of the image
 * @param image
 * @param maxSize
 * @return
 */
public Bitmap getResizedBitmap(Bitmap image, int maxSize) 
    int width = image.getWidth();
    int height = image.getHeight();

    float bitmapRatio = (float)width / (float) height;
    if (bitmapRatio > 1) 
        width = maxSize;
        height = (int) (width / bitmapRatio);
     else 
        height = maxSize;
        width = (int) (height * bitmapRatio);
    
    return Bitmap.createScaledBitmap(image, width, height, true);

llamando al método:

Bitmap converetdImage = getResizedBitmap(photo, 500);

Dónde photo es tu mapa de bits

Aquí está la solución que limita la calidad de la imagen sin cambiar width y height. La idea principal de este enfoque es comprimir el mapa de bits dentro del bucle mientras el tamaño de salida es mayor que maxSizeBytesCount. Créditos a esta pregunta por la respuesta. Este bloque de código muestra solo la lógica de reducir la calidad de la imagen:

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        int currSize;
        int currQuality = 100;

        do 
            bitmap.compress(Bitmap.CompressFormat.JPEG, currQuality, stream);
            currSize = stream.toByteArray().length;
            // limit quality by 5 percent every time
            currQuality -= 5;

         while (currSize >= maxSizeBytes);

Aquí está el método completo:

public class ImageUtils 

    public byte[] compressBitmap(
            String file, 
            int width, 
            int height,
            int maxSizeBytes
    )  widthRatio > 1)
        
            if (heightRatio > widthRatio)
            
                bmpFactoryOptions.inSampleSize = heightRatio;
             else 
                bmpFactoryOptions.inSampleSize = widthRatio;
            
        

        bmpFactoryOptions.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        int currSize;
        int currQuality = 100;

        do 
            bitmap.compress(Bitmap.CompressFormat.JPEG, currQuality, stream);
            currSize = stream.toByteArray().length;
            // limit quality by 5 percent every time
            currQuality -= 5;

         while (currSize >= maxSizeBytes);

        return stream.toByteArray();
    

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *