Android ¿cómo reducir tamaño de un bitmap?

publicado por: Anonymous

Tengo una aplicación que permite al usuario cambiar su imagen de perfil por alguna otra que tenga almacenada en su dispositivo. Para ello, la aplicación envía la imagen seleccionada a un servidor remoto. Todo esto funciona bien, así que no pongo el código de esa parte para no complicar la pregunta. Mi problema es que quiero que esa imagen que envíe al servidor se reduzca de tamaño para impedir, por ejemplo, archivos grandes de cinco o seis megas, que ralentizan mucho la aplicación. Pero no me termina de salir bien.

Así tengo el código:

if (requestCode == 1 && resultCode == RESULT_OK) {

            Uri selectedImageUri = data.getData();
            imagepath = getPath(selectedImageUri);
            Bitmap bitmap=BitmapFactory.decodeFile(imagepath);

            ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();

            //Redimensiona la imagen antes de redondearla
            Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, false);

            resizedBitmap.compress(Bitmap.CompressFormat.JPEG,50,bytearrayoutputstream);


            //Redondear la imagen
            int min = Math.min(resizedBitmap.getWidth(), resizedBitmap.getHeight());

            Bitmap bitmapRounded = Bitmap.createBitmap(min, min, resizedBitmap.getConfig());

            Canvas canvas = new Canvas(bitmapRounded);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(resizedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
            canvas.drawRoundRect((new RectF(0.0f, 0.0f, min, min)), min / 2, min / 2, paint);

            //al terminar el proceso, carga la imagen en el ImageView correspondiente
            avatar.setImageBitmap(bitmapRounded);

}

El bitmap lo intento redimensionar (esto funciona bien), después lo intento reducir de tamaño (no funciona) y, por último, redondeo la imagen (también funciona bien) antes de ajustarla al ImageView correspondiente.

Lo único que no consigo que me funcione correctamente es reducir el tamaño de la imagen.

Alguna sugerencia? Gracias.

solución

Para reducir el tamaño en bytes debes revisar estos métodos los cuales estas en realidad usando en tu programa:

Puedes usar el redimensionamiento del bitmap al ser creado cuando haces uso del método createScaledBitmap(Bitmap, int, int, boolean), aquí puedes reducir el ancho y alto del bitmap :

Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 100 /*Ancho*/, 100 /*Alto*/, false /* filter*/);

Importante considerar el valor del parámetro filter:

filter: Se debe utilizar o no el filtrado bilineal al escalar el mapa
de bits. Si es true, se utilizará el filtrado bilineal al
escalar, que tiene una mejor calidad de imagen al costo de un peor
rendimiento. Si es false, entonces se usa la escala del vecino más
cercano, que tendrá una peor calidad de imagen pero es más rápida. El
valor predeterminado recomendado es establecer el filtro en
“verdadero”, ya que el costo del filtrado bilineal suele ser mínimo y
la calidad de imagen mejorada es significativa.

También puedes cambiar la calidad de la imagen al crear el bitmap, lo cual también reduce el tamaño mediante compress(Bitmap.CompressFormat format, int quality, OutputStream stream):

 resizedBitmap.compress(Bitmap.CompressFormat.JPEG,40 /*Calidad*/,bytearrayoutputstream);

Estos dos métodos permiten que al crear tu bitmap este reduzca su tamaño en bytes.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *