Que fait le paramètre de filtre pour createScaledBitmap?

210

La déclaration de android.graphics.Bitmap.createScaledBitmapest

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

Cependant, la documentation n'explique aucun des paramètres. Tous sont assez évidents à l'exception de boolean filter. Quelqu'un sait-il ce qu'il fait?

clahey
la source

Réponses:

86

Une fouille rapide dans le code source SKIA indique que (au moins par défaut) l'indicateur FILTER lui fait effectuer une interpolation bilinéaire simple. Consultez Wikipedia ou votre référence graphique préférée pour voir quelles sont les conséquences attendues. Traditionnellement, vous souhaitez effectuer une interpolation bilinéaire ou bicubique lors de la mise à l'échelle des images et une moyenne de zone lors de la réduction des images. J'ai l'impression (bien que je sois heureux d'être corrigé) qu'Android / Skia effectue un sous-échantillonnage simple lors de la réduction des effectifs sans filtrage, de sorte que vous obtiendrez probablement de meilleurs résultats du filtrage même lors de la réduction des effectifs. (Il existe une autre méthode pour obtenir une réduction des effectifs de haute qualité avec interpolation, impliquant une série de réductions d'échelle de 50%. Voir http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html pour plus de détails.)

apiculteur
la source
5
Que fait-il si vous le passez faux? Voisin le plus proche?
clahey
De plus, savez-vous s'il fait la moyenne de la zone si vous passez filter = true?
clahey
Vous devez ajouter une image pour avoir une idée de la différence, au lieu de référencer des sources externes. Les liens meurent, les sources disparaissent.
Maarten
253

Pour développer la réponse de Karan: En règle générale , vous ne verrez aucune différence si vous augmentez l' échelle de votre image vers le bas , mais vous si vous mettre à l' échelle en place .

Le dépassement filter = falsese traduira par une image pixellisée en blocs.

Passer filter = truevous donnera des bords plus lisses.

Cependant, comme EIYeante l'a souligné dans les commentaires, vous pouvez toujours voir une différence. Ceci est leur exemple d'image.

teedyay
la source
6
@Mirko - non, ça va: cela devrait me rapporter le badge populiste d'une minute à l'autre. :)
teedyay
@ElYeante - avez-vous un exemple? Certaines images d'entrée et de sortie seraient formidables. Merci.
teedyay
8
@teedyay regardez cet exemple: dl.dropboxusercontent.com/u/18446310/… L'image originale a une résolution de 1232x2048. Je fais un donwscaling lourd avec ce code: bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);je change juste le paramètre de filtre.
ElYeante
2
ce drapeau est trompeur. comment pouvons-nous sous-échantillonner avec le lissage avant le rééchantillonnage pour empêcher l'anti-aliasing?
Sam
1
Le lien a rompu @teedyay
Sagar
2

Le filtre définira le FILTER_BITMAP_FLAG pour la peinture, ce qui affecte l'échantillonnage des bitmaps lorsqu'ils sont transformés en fonction de la valeur que vous fournissez.

Karan
la source
2
Quel effet cela a-t-il sur l'échantillonnage des bitmaps?
clahey
Je ne sais pas grand chose sur l'échantillonnage bitmap, vous pouvez consulter la page wiki suivante pour plus de détails. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan
"affecte l'échantillonnage des bitmaps" dans quoi quoi exactement? Est-ce un bon ou un mauvais effet?
William Denniss
@Willian Denniss: Vérifiez le commentaire ci-dessus. Je ne connais pas les détails et je n'ai pas encore essayé.
Karan
0

Un peu tard pour la fête, mais j'ai pensé que quelques exemples d'images pourraient clarifier le problème.

L'API d'Android ne spécifie pas quel type de filtre serait appliqué, donc je suppose que la question est: voulez-vous que vos pixels restent tels qu'ils sont (comme vous le voudriez dans l'art 8 bits) ou est-il correct d'appliquer une transformation à rendre l'image plus agréable au goût (comme vous le voudriez sur les photos).

Il y a une question plus générale à savoir si et comment filtrer sur superutilisateur .

Dit Jeff Atwood:

En général, vous voulez un effet de netteté doux lorsque vous faites une image plus grande en une plus petite, et un effet de flou léger lorsque vous faites une image plus petite en une plus grande.

filtres d'image comparés

Maarten
la source