Cómo cambiar el tamaño de Bitmaps de la manera óptima en Android?

Supongamos que tengo un hexágono:

hexágono

Si cambio de tamaño esto para usarlo en mi aplicación que contiene una cuadrícula de hexágonos:

// ... bgPaint = new Paint(); bgPaint.setAntiAlias(true); bgPaint.setDither(true); // ... Bitmap coloredBackground = BitmapFactory.decodeResource(getResources(), R.drawable.bg); // ... canvas.drawBitmap(coloredBackground, null, getAsRect(), bgPaint); 

Entiendo esto:

Hexágonos

getAsRect() devuelve un objeto Rect que utilizo para dibujar. Lo que quiero lograr es deshacerse de esos píxeles transparentes en los bordes. Creo que estoy haciendo algo mal, pero no pude encontrar dónde hasta ahora. ¿Tiene alguna idea de cómo puedo resolver este problema?

Traté de experimentar con tintineo y antialias, pero nada cambió.

3 sugerencias:

1

Pruebe esto: Desactive la escala del sistema al descodificar el recurso estableciendo BitmapFactory.Options.inScaled en false:

 Options options = new BitmapFactory.Options(); options.inScaled = false; Bitmap source = BitmapFactory.decodeResource(context.getResources(), R.drawable.bg, options); 

El indicador inScaled debe estar desactivado si necesita una versión no escalada del mapa de bits.

A continuación, escala tu mapa de bits con Bitmap.createScaledBitmap(...) .

2

Otra posible razón es que las líneas diagonales de tu azulejo negro contienen diferentes tonos de gris:

Esto es un cierre para arriba de su azulejo:

Introduzca aquí la descripción de la imagen

Su anti-alias antes de que sea redimensionado. Los píxeles que no sean totalmente negros pueden mostrar un color más claro en las líneas redimensionadas. Usted podría cambiar sus líneas de líneas para ser completamente negro (0xFF000000) y hacer anti-alias sólo después del cambio de tamaño.

3

Otra solución a este problema es diseñar su azulejo así:

Introduzca aquí la descripción de la imagen

Que evita el problema de dibujar dos líneas diagonales suavizadas una al lado de la otra.

¿Por qué no usar este en su lugar?

 Bitmap.createScaledBitmap(decodedBitmap, targetWidth, targetHeight, true); 

Puede probar un algoritmo de cambio de tamaño de hqx :

Alternativamente, usted podría pintar en una superficie más grande, y escalar esa superficie por completo.

Estoy cambiando el tamaño de las imágenes de la siguiente manera:

  String url = ""; //replace with path to your image int imageDimension = 48; // replace with required image dimension //decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(url), null, o); //Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = imageDimension; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while(true){ if(width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } //decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Drawable drawable = new BitmapDrawable(context.getResources(), BitmapFactory.decodeStream(new FileInputStream(url), null, o2)); 
  • Advertencia incorrecta de Lint de Android sobre recursos no utilizados
  • ¿Convertir el flotador a CharSequence en android?
  • Error al iniciar la actividad Android Studio 2.1
  • Excepción al intentar crearOrUpdate un objeto utilizando OrmLite
  • Cómo rellenar una base de datos SQLite con datos de un archivo xml?
  • ¿Cómo puedo crear una conexión de socket persistente en Android?
  • Cordova está ejecutando la versión incorrecta de Java. ¿Cómo puedo obtener Cordova para ejecutar una versión específica de Java?
  • ¿Cómo puedo usar Proguard en Eclipse para proyectos Java NO-Android?
  • ¿Es un enum Serializable también?
  • Jodatime inicio del día y fin del día
  • Android: dónde almacenar el archivo Selector (xml) para los controles de diseño personalizados
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.