2010-03-25 23 views
16

Quiero dibujar un mapa de bits en un lienzo con un tamaño más grande de lo que es. Puedo usar canvas.drawBitmap (bitmap, null, destRect, null); pero eso da una calidad pobre, ya que el resultado está pixelado, si la imagen de origen es más pequeña que el rectángulo de destino.Cómo dibujar y escalar un mapa de bits en un lienzo utilizando la interpolación bicúbica en Android?

¿Cómo puedo dibujar mi mapa de bits utilizando un remuestreo bilineal o bicúbico?

Cualquier ayuda sería apreciada, gracias.

Respuesta

34

Debe configurar el indicador FILTER_BITMAP_FLAG en su pintura.

canvas.drawBitmap(bitmap, matrix, null); //ugly jaggies unless scale is 1:1, but fast 

o

Paint paint = new Paint(); 
paint.setFilterBitmap(); 
canvas.drawBitmap(bitmap, matrix, paint); // pretty but slower (not too slow, usually) 

Lo mismo se aplica a otras formas (azúcar sintáctico) del método drawBitmap.

No hay documentación en ninguna parte para la mayoría de las opciones de dibujo de Android y tampoco hay documentación para la biblioteca Skia nativa subyacente que hace la representación. Estaría más feliz si hubiera. Puede buscar el código fuente de Skia en Google Code Search. Busque Skia y explore la fuente en bruto; esa es la única documentación.

+4

tenido que lidiar con esto ahora, gracias por señalar setFilterBitmap! Solo para agregar un poco más de información de mis hallazgos, la interpolación para el indicador de mapa de bits de filtro falso es el vecino más cercano y verdadero es bilineal. Estaba esperando que el bicúbico estuviera disponible, pero no se ve así. – Dave

+1

paint.setFilterBitmap(); no es demasiado lento, porque la mayor parte del nivel dispositivo/api está usando gpu para hacer la interpolación. –

+0

Exactamente el mismo comportamiento, un poco más condensado: canvas.drawBitmap (mapa de bits, 0, 0, Paint nuevo (Paint.FILTER_BITMAP_FLAG)); –

0

FILTER_BITMAP_FLAG no funciona para downscaling en la mayoría de los casos.

buen algoritmo de reducción de escala (vecino más cercano no similares) consiste en sólo 2 pasos (además de cálculo de la Rect exacta de entrada/salida de imágenes de cultivos):

  1. descendente de la escala usando BitmapFactory.Options :: inSampleSize- > BitmapFactory.decodeResource() lo más cerca posible a la solución que necesita, pero no menos de lo que
  2. llegar a la resolución exacta de reducción de escala un poco usando lienzo :: drawBitmap()

Aquí es una explicación detallada de cómo SonyMobile resuelve esta tarea: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

Aquí está el código fuente de utilidades escala SonyMobile: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

Cuestiones relacionadas