Android: rapide bitmap flou?
J'ai été à la recherche de ces trois derniers jours pour une accélération matérielle façon de bluring un bitmap avec android. Je suis tombé sur certaines des solutions de rechange comme le rétrécissement de l'image et à l'échelle de nouveau, mais cette méthode a produit de faible qualité des résultats qui n'étaient pas adaptés à mon image, reconnaissance des exigences. J'ai aussi lu que la mise en œuvre de la convolution avec des shaders ou JNI est une bonne façon d'aller, mais je ne peux pas croire qu'il n'existe pas de solution intégrée dans le Android le cadre de cette très objectif commun. Actuellement j'ai fini avec un auto-écrite de convolution de la mise en œuvre en Java, mais il est trop lent. Ma question est:
- Est-il pas vraiment de solution intégrée dans l'Android cadre?
- Dans le cas où il n'y a aucun: quel est le moyen le plus efficace de l'accélération de la convolution avec un reste raisonnable complexité de mise en œuvre et de l'entretien? Doit-on utiliser JNI, les shaders ou quelque chose de complètement différent?
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé une solution convenable:
Toutefois, la documentation sur le
ScriptIntrinsicBlur
classe est très rare et j'ai passé plus de temps à trouver la bonne invocation d'arguments. Pour bluring ordinaireARGB_8888
tapé bitmap nomméphoto
, ils sont ici:Probablement les plus exigeants exigence est vivre flou, ce qui signifie que vous flou vivre comme les changements de vue. Dans cette situation, un flou qui ne devrait pas prendre plus de 10 ms (pour avoir quelques jeux sur le 16ms/60fps) pour un rendu lisse. Il est possible d'obtenir cet effet avec les bons réglages, même pas si smartphones (galaxy s3 et même plus lent).
Ici est de savoir comment améliorer le rendement décroissant d'importance:
Utiliser des images réduites:
Cela diminue les pixels de flou énormément. Aussi il travaille pour vous quand vous voulez une vraie image floue. Aussi l'image de chargement et de la consommation de mémoire est considérablement abaissé.
Utilisation Renderscript ScriptIntrinsicBlur - il n'est probablement pas une meilleure, plus rapide solution dans Android à partir de 2014. Une erreur que je vois souvent, c'est que le Renderscript contexte n'est pas réutilisé, mais elle est créée à chaque fois que l'algorithme de flou est utilisé. Esprit vous que
RenderScript.create(this);
prend environ 20ms sur un Nexus 5, si vous voulez éviter cela.La réutilisation des Bitmaps: ne pas créer des instances inutiles et toujours utiliser la même instance. Lorsque vous avez vraiment besoin rapide de flou, la collecte des ordures joue un rôle majeur (en prenant un bon de 10 à 20 ms pour la collecte de certaines des images). Aussi la culture et le flou que ce que vous avez besoin.
Pour un live flou, probablement en raison de la commutation de contexte, il n'est pas possible de flou dans un autre thread (même avec threadpools), seul le thread principal a été suffisamment rapide pour suivre le point de vue mis à jour en temps opportun, avec les threads, j'ai vu gal de 100-300ms
sur plus de conseils, voir mon autre post ici https://stackoverflow.com/a/23119957/774398
btw. J'ai fait un simple live flou dans cette application: github, Playstore