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.

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?

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

  1. 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
  2. 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.

  • WebView no está llenando toda la pantalla del dispositivo o el emulador
  • Inconsistencia al establecer el tamaño de fuente de TextView en el código y en los recursos
  • Cómo corregir el error en el tamaño de mapa de bits supera el presupuesto de VM
  • Admob no llena todo el ancho
  • Android WallpaperManager cosecha la imagen
  • android webview setdefaultfontsize (tamaño int), ¿cuál es la unidad de tamaño?
  • Tamaño de fuente pequeño en el emulador de Android
  • ¿Debo cambiar el tamaño del mapa de bits antes de agregar a un ImageView o dejar que el ImageView cambiar el tamaño del mapa de bits?
  • Android codificar imagen con límite de tamaño máximo
  • ¿Android obtiene el tamaño de pantalla obsoleto?
  • Obtener el tamaño mostrado de una imagen dentro de un ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.