Android: Cambiar el tamaño de los mapas de bits sin perder calidad
Realmente he buscado en toda la web antes de publicar. Mi problema es que no puedo cambiar el tamaño del mapa de bits sin perder la calidad de la imagen (la calidad es muy mala y pixelada).
Tomo el mapa de bits de la cámara y luego tengo que bajar la escala, así que puedo subirlo al servidor mucho más rápido.
- Tamaño de fondo de la imagen de la actividad de Android
- Diferentes tamaños en 2 dispositivos, incluso si utilizo "dp"
- ¿Es posible configurar el fondo de pantalla tal como se hace con la aplicación que viene con Android?
- La mayoría de los tamaños de pantalla populares / resoluciones en los teléfonos Android
- Android xxxhdpi resolución extraíble auto redimensionar
Esta es la función que realiza el muestreo
public Bitmap resizeBitmap(Bitmap bitmap){ Canvas canvas = new Canvas(); Bitmap resizedBitmap = null; if (bitmap !=null) { int h = bitmap.getHeight(); int w = bitmap.getWidth(); int newWidth=0; int newHeight=0; if(h>w){ newWidth = 600; newHeight = 800; } if(w>h){ newWidth = 800; newHeight = 600; } float scaleWidth = ((float) newWidth) / w; float scaleHeight = ((float) newHeight) / h; Matrix matrix = new Matrix(); // resize the bit map matrix.preScale(scaleWidth, scaleHeight); resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setDither(true); canvas.drawBitmap(resizedBitmap, matrix, paint); } return resizedBitmap;
y así es como obtengo la imagen del resultado de la actividad
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode != RESULT_CANCELED){ if (requestCode == 0) { if (resultCode == RESULT_OK) { getContentResolver().notifyChange(mImageUri, null); ContentResolver cr = this.getContentResolver(); try { b = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri); Log.d("foto", Integer.toString(b.getWidth())); Log.d("foto", Integer.toString(b.getHeight())); addPhoto.setImageBitmap(b); } catch (Exception e) { Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show(); Log.d("TAG", "Failed to load", e); } } }
Estoy empezando a pensar que la mejor manera de obtener un pequeño tamaño de imagen es establecer la resolución de la cámara. ¿Alguien más puede ayudar?
- La barra de direcciones del navegador Mobile Webkit cambia $ (ventana) .height (); Haciendo el fondo-tamaño: la cubierta rescale cada vez
- Android: Tamaño de texto de Canvas.drawText () en diferentes resoluciones de pantalla
- View getWidth () y getHeight () devuelven 0
- Aplicación para Android: admite todos los tamaños de pantalla
- Cómo obtener el tamaño de un cuadro de diálogo personalizado en android?
- Tamaños de imagen de Android
- El tamaño de .apk está aumentando con el aumento con los dispositivos de destino (LDPI, MDPI, HDPI, Pantallas X-Large)
- Android: layout_height 50% del tamaño de la pantalla
Pruebe Bitmap.createScaledBitmap . También tiene una opción para filtrar la fuente.
Un buen algoritmo de downscaling (no el vecino más cercano) consiste en sólo 2 pasos (más el cálculo del Rect exacto para las imágenes de entrada / salida):
- downscale usando BitmapFactory.Options :: inSampleSize-> BitmapFactory.decodeResource () tan cerca como sea posible de la resolución que usted necesita, pero no menos de lo que
- llegar a la resolución exacta mediante la reducción de escala un poco utilizando Canvas :: drawBitmap ()
Aquí está una explicación detallada de cómo SonyMobile resolvió esta tarea: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/
Aquí está el código fuente de las utilidades de escala de SonyMobile: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/
Pruebe el código mencionado a continuación para cambiar el tamaño del mapa de bits.
public Bitmap get_Resized_Bitmap(Bitmap bmp, int newHeight, int newWidth) { int width = bmp.getWidth(); int height = bmp.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 newBitmap = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, false); return newBitmap ; }
He utilizado este código para reducir el tamaño de mi mapa de bits, y su calidad, bueno .., era aceptable.
Espero que esto ayude.
- Reemplazar cadenas en una cadena larga:
- Necesita utilizar un código de versión diferente para su APK porque ya tiene uno con el código de versión 1