Imágenes de escala baja en Android: ¿se puede hacer?

Tengo problemas para limpiar las imágenes en Android. Estoy buscando para escalar pequeñas imágenes PNG entre tamaños arbitrarios de alrededor de 10-100% de su tamaño original.

He creado una imagen de muestra para demostrar el problema y exacerbar los comportamientos inusuales que veo en el escalador de imágenes de Android:

NOTA: deseará hacer clic con el botón derecho en la imagen y verla directamente ... esta página puede reducir la escala de la imagen de nuevo La imagen anterior es una captura de pantalla de un dispositivo Android con algunas anotaciones agregadas. También he añadido las mismas imágenes en una segunda columna en el lado izquierdo mostrando cómo se renderizan con una escala lineal por "The GIMP" (GNU Image Manipulation Program).

La imagen de la base consiste en un fondo del modelo del tablero de ajedrez de pixeles rojos y azules. Sobre ese fondo he dibujado algunas líneas amarillas 1px-anchas y texto verde bastante fino. La imagen es 288×288 píxeles.

Al escalar la imagen a 1/3 de sus dimensiones originales, Android parece simplemente agarrar uno en nueve píxeles, arrojando todos los demás datos. Algunas de las líneas amarillas desaparecen por completo como resultado. Sorprendentemente, el patrón de tablero de ajedrez permanece intacto (que es simplemente un resultado de cada 3 º píxel que se utiliza).

Al escalar la imagen a una dimensión de casi-pero-no exactamente el 50% de su tamaño original, por ejemplo, 142×142 o 143×143, el escalador crea algunas anomalías / artefactos bastante grandes en la imagen.

A 50% de tamaño (144×144), la imagen parece correcta.

La imagen de prueba saca lo peor del escalador de imagen, pero las imágenes de iconos PNG "normales" también se ven gravemente afectadas. De 10-33% o así las imágenes no son correctamente remuestreadas, y por lo tanto aparecen extremadamente "mapa de bits". Y ciertas imágenes de mayor tamaño tienen anomalías muy extrañas en ellos en ciertos tamaños.

Si alguien sabe un medio para desactivar este comportamiento de escala extraño, incluso a un costo de rendimiento, me gustaría mucho saber acerca de ello. Sin duda se puede resolver mediante la escritura de un algoritmo que funciona directamente en los píxeles de mapas de bits, pero espero que no es la única opción.

También es de destacar el hecho de que todo el trabajo de imagen se está haciendo con ARGB_8888 Bitmap.Configs. He intentado manipular el tamaño de imagen estableciendo maxwidth / maxheight en ImageViews, utilizando Bitmap.createScaledBitmap (), y utilizando Bitmap.createBitmap con una matriz. Todos los intentos tienen el mismo resultado. El filtrado de mapas de bits está habilitado.

Gracias de nuevo por cualquier sugerencia!

El uso de Bitmap.createScaledBitmap () y Bitmap.createBitmap con una matriz es el mismo; Consulte el origen de Bitmap.createScaledBitmap (que no ha cambiado desde Android 2).

En Android 4.0 o superior, el uso de una matriz (como en Bitmap.createScaledBitmap) permite operaciones aceleradas por hardware si están habilitadas (activadas por defecto en 4.1+ IIRC), por lo tanto no tenemos control directo sobre lo que se está haciendo y cómo se hace .

Eso significa que usted tendrá que implementar su propio método de escala usando el filtrado deseado (aquí, lineal); Ya sea por procesamiento de píxeles; O usar OpenGL ES con el filtro bueno, pero puede no estar disponible en todos los dispositivos.

  • Android: Obtención de un mapa de bits desde una conexión de url (graph.facebook.com) que redirige a otra url
  • CORRUPCIÓN DE MEMORIA HEAP EN los errores dlmalloc o dlfree y SIGSEGV en Android ICS 4.0
  • Android - Lienzo drawLine dentro de ImageView
  • La compresión de mapa de bits de Android no es buena
  • Mostrar imagen grande de la tarjeta SD en Android
  • ImageView: recicla automáticamente el mapa de bits si ImageView no está visible (dentro de ScrollView)
  • Herramienta para convertir en lotes bitmaps de recursos de Android a diferentes densidades
  • ¿Mejor velocidad de cuadro que dibuja los mapas de bits en una lona?
  • Preservar la calidad de la imagen cuando decodifique el flujo en android
  • Rasca la pantalla para mostrar una imagen en android
  • Android ImageReader.acquireLatestImage devuelve JPG no válido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.