2009-12-30 20 views
0

J'utilise le filtre de flou ActionScript standard pour flouter une image. L'image sera ensuite utilisée comme carte de texture sur un cylindre, c'est-à-dire que les bords gauche et droit se rencontreront en 3D. Cela semble mauvais parce que le filtre de flou a des discontinuités aux bords de l'image. Je voudrais le définir pour qu'il entoure l'image de sorte que, au lieu de tronquer le noyau de filtre, il fasse une opération modulo pour obtenir le pixel de l'autre extrémité. Est-ce possible?ActionScript BlurFilter wrap around

Si ce n'est pas le cas, quel est le meilleur moyen d'écrire vous-même de telles fonctions dans ActionScript? J'imagine que l'utilisation de getPixel32 et setPixel32 serait trop lente pour les images plus grandes?

Répondre

1

Option 1: créer une image étendue par le rayon du flou. Donc vous faites quelque chose comme buffer = new BitmapData(src.width + 2 * radius, src.height + 2 * radius, src.transparent, 0) puis vous dessinez le src sur le tampon avec une matrice traduite par rayon. Comme m = new Matrix() et puis m.translate(radius, radius) et enfin buffer.draw(src, m) maintenant il vous suffit d'appeler buffer.applyFilter avec new BlurFilter(radius, radius) et d'appeler copyPixels avec new Rectangle(radius, radius, src.width, src.height) et vous avez terminé.

Deuxième option: utilisez Adobe PixelBender si votre rayon de flou ne change pas. Vous pouvez écrire le modulo vous-même et cela ne devrait pas être difficile. Option trois: Implémentez votre propre noyau de Gauss - ce ne sera jamais aussi rapide que l'option un mais plus rapide que l'option deux puisque vous pouvez toujours mettre en mémoire tampon n-1 colonnes de la matrice pour un flou et calculer juste le n + 1 colum. Cependant, vous utiliserez BitmapData.getVector pour obtenir une mémoire tampon de pixels une fois au lieu d'appeler getPixel32 repeateadly.

+0

Merci Joa, j'ai mis en place votre option un. Détruit un peu de CPU en copiant les canaux des images énormes autour, mais fonctionne. Venant de C++ mon expérience ActionScript est limitée, mais jusqu'à présent, je trouve que je paye beaucoup pour des "abstractions qui fuient". C'est à dire. Les librairies sont parfaites, mais une fois que vous avez besoin d'implémenter un support de bas niveau, cela semble extraordinairement lourd et lent. – BuschnicK

+0

Une autre option serait d'utiliser toujours le plus grand BitmapData afin de ne pas gaspiller de ressources et de modifier vos cartes UV selon. Vous devez essentiellement décaler toutes les coordonnées UV par rayon. –