214 votes

Que fait le paramètre de filtre de createScaledBitmap ?

La déclaration de android.graphics.Bitmap.createScaledBitmap es

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 ?

258voto

teedyay Points 10833

Pour développer la réponse de Karan : En règle générale, vous ne verrez pas de différence si vous mettez votre image à l'échelle. en bas mais tu le feras si tu le mets à l'échelle. en haut .

Passing filter = false aura pour résultat une image pixellisée.

Passing filter = true vous donnera des bords plus lisses.

Cependant, comme EIYeante l'a fait remarquer dans les commentaires, vous pourriez quand même voir une différence. Il s'agit de leur image d'exemple.

6 votes

@Mirko - non, c'est bon : cela devrait me valoir le badge de populiste d'une minute à l'autre :)

0 votes

@ElYeante - avez-vous un exemple ? Des images d'entrée et de sortie seraient parfaites. Merci.

0 votes

Wow. Je me suis trompé. Je suis curieux de savoir pourquoi c'est si évident avec vos images, mais je ne l'ai pas vu avec les miennes. Est-ce parce que vous réduisez tellement l'échelle, peut-être ?

88voto

beekeeper Points 1616

Un rapide coup d'œil dans le code source de SKIA indique que (au moins par défaut) le drapeau FILTER lui permet de faire 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 voulez faire une interpolation bilinéaire ou bicubique lorsque vous augmentez la taille des images, et une moyenne de zone lorsque vous la diminuez. J'ai l'impression (mais je suis heureux d'être corrigé) qu'Android/Skia fait un simple sous-échantillonnage lors de la réduction de taille sans filtrage, donc vous obtiendrez probablement de meilleurs résultats avec le filtrage même lors de la réduction de taille. (Il existe une autre méthode pour obtenir une réduction de taille 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).

5 votes

Que fait-il si vous lui passez false ? Le plus proche voisin ?

0 votes

De plus, savez-vous s'il fait la moyenne de la zone si vous passez filter = true ?

0 votes

Vous devriez ajouter une image pour vous faire une idée de la différence, au lieu de faire référence à des sources externes. Les liens meurent, les sources disparaissent.

4voto

Maarten Points 1279

J'arrive un peu tard dans la soirée, mais j'ai pensé que quelques exemples d'images pourraient clarifier la question.

image filters compared

Une question plus générale se pose quant à savoir si et comment filtrer sur superutilisateur .

Dit Jeff Atwood :

En général, vous souhaitez un léger effet de netteté lorsque vous transformez une grande image en une petite, et un léger effet de flou lorsque vous transformez une petite image en une grande.

L'API d'Android ne précise pas le type de filtre à appliquer. La question est donc la suivante : voulez-vous que vos pixels restent tels quels (comme dans l'art 8 bits) ou est-il possible d'appliquer une transformation pour rendre l'image plus acceptable (comme dans les photographies) ?

3voto

Karan Points 6418

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

2 votes

Quel effet cela a-t-il sur l'échantillonnage des bitmaps ?

0 votes

Je ne m'y connais pas beaucoup en échantillonnage bitmap, vous pouvez consulter la page wiki suivante pour plus de détails. fr.wikipedia.org/wiki/Réséchantillonnage_%28bitmap%29

0 votes

"affecte l'échantillonnage des bitmaps" en quoi exactement ? S'agit-il d'un bon ou d'un mauvais effet ?

0voto

Krzysztof K Points 1

Au cours de mes recherches sur l'algorithme utilisé lorsque filter=false (J'avais besoin d'être sûr à 100% de la sortie produite) car j'utilisais le même modèle tensorflow lite sur Android et python et j'ai constaté qu'il utilise le plus près (testé sur Android 7.1) quand filter=false . J'ai comparé des embeddings qui étaient identiques sur Android et sur python lorsqu'ils étaient utilisés. PIL resample=Image.NEARES T

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X