¿Qué hace el parámetro de filtro para createScaledBitmap?

210

La declaración de android.graphics.Bitmap.createScaledBitmapes

public static Bitmap createScaledBitmap
  (Bitmap src, int dstWidth, int dstHeight, boolean filter)

Sin embargo, la documentación no explica ninguno de los parámetros. Todos ellos son bastante obvios, excepto boolean filter. ¿Alguien sabe lo que hace?

clahey
fuente

Respuestas:

86

Una búsqueda rápida en el código fuente de SKIA indica que (al menos por defecto) el indicador FILTER hace que realice una interpolación bilineal directa. Consulte Wikipedia o su referencia gráfica favorita para ver cuáles son las consecuencias esperadas. Tradicionalmente, desea realizar una interpolación bilineal o bicúbica al aumentar el tamaño de las imágenes, y promediar el área al reducir el tamaño de las imágenes. Tengo la impresión (aunque me alegra que me corrijan) que Android / Skia realiza un submuestreo simple cuando se reduce el tamaño sin filtrar, por lo que es probable que obtenga mejores resultados al filtrar incluso cuando se reduce. (Hay un método alternativo para obtener una reducción de tamaño de alta calidad con interpolación, que implica hacer una serie de reducciones de escala del 50%. Ver http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html para detalles.)

apicultor
fuente
55
¿Qué hace si lo pasa falso? ¿Vecino más cercano?
clahey
Además, ¿sabe si está haciendo un promedio de área si pasa filter = true?
clahey
Debe agregar una imagen para tener una idea de cuál es la diferencia, en lugar de hacer referencia a fuentes externas. Los enlaces mueren, las fuentes desaparecen.
Maarten
253

Para ampliar la respuesta de Karan: Como regla general, usted no verá ninguna diferencia si usted está escalando la imagen de abajo , pero usted si usted está escalarla hasta .

Su aprobación filter = falsedará como resultado una imagen en bloques y pixelada.

Pasar filter = truele dará bordes más suaves.

Sin embargo, como EIYeante señaló en los comentarios, aún puede ver una diferencia. Esta es su imagen de ejemplo.

teedyay
fuente
66
@Mirko - nah, está bien: esto debería ganarme la insignia populista en cualquier momento. :)
teedyay
@ElYeante: ¿tienes un ejemplo? Algunas imágenes de entrada y salida serían geniales. Gracias.
teedyay
8
@teedyay mira este ejemplo: dl.dropboxusercontent.com/u/18446310/… La imagen original tiene una resolución de 1232x2048. Estoy haciendo una gran escala con este código: bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);solo estoy cambiando el parámetro de filtro.
ElYeante
2
Esta bandera es engañosa. ¿Cómo podemos reducir la muestra con suavizado antes de volver a muestrear para evitar el suavizado?
Sam
1
El enlace se ha roto @teedyay
Sagar
2

El filtro establecerá FILTER_BITMAP_FLAG para pintar, lo que afecta el muestreo de mapas de bits cuando se transforman en función del valor que proporcione.

Karan
fuente
2
¿Qué efecto tiene en el muestreo de mapas de bits?
Clahey
No sé mucho sobre el muestreo de mapas de bits, puede consultar la siguiente página wiki para obtener más detalles. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan
"afecta el muestreo de mapas de bits" ¿en qué qué exactamente? ¿Es un buen efecto o uno malo?
William Denniss
@Willian Denniss: Revise el comentario anterior. No conozco los detalles y aún no lo he probado.
Karan
0

Un poco tarde para la fiesta, pero pensé que algunas imágenes de muestra podrían aclarar el problema.

La API de Android no especifica qué tipo de filtro se aplicaría, por lo que supongo que la pregunta es: ¿desea que sus píxeles permanezcan como están (como desearía en el arte de 8 bits) o está bien aplicar una transformación a haga que la imagen sea más agradable (como desearía en las fotografías).

Hay una pregunta más general sobre si y cómo filtrar en superusuario .

Jeff Atwood dice:

En general, desea un efecto de nitidez leve cuando convierte una imagen más grande en una más pequeña, y un efecto de desenfoque leve cuando convierte una imagen más pequeña en una más grande.

filtros de imagen comparados

Maarten
fuente