2010-12-09 15 views
0

Je dessine des voitures. Ils sont Bitmap, chargés à partir de PNG dans la bibliothèque. Je dois pouvoir colorier les voitures - les rouges et les vertes et les bleues, peu importe. Cependant, lorsque vous peignez la voiture en vert, les pneus devraient rester noirs et les fenêtres resteront de la couleur de la fenêtre.Redialisation partielle d'un bitmap en cours d'exécution

Je connais deux façons de gérer cela, ni l'un ni l'autre ne me rendent heureux. D'abord, je pourrais avoir deux bitmaps pour chaque voiture; un en dessous pour la couleur du corps, et un sur le dessus pour les bits de détail. Le bitmap en dessous obtient son set transform.colorTransform pour transformer la carrosserie blanche en la couleur dont j'ai besoin. Pas génial, car je me retrouve avec deux fois plus de Bitmap à l'écran lors de l'exécution. Deuxièmement, je pourrais par programme rechercher et remplacer «blanc» avec la couleur «carrosserie» lorsque je charge le bitmap pour chaque voiture. Pas génial non plus, car la quantité de mémoire que je prends multiplie par toutes les couleurs dont j'ai besoin. Ce que je voudrais serait une façon de dire «dessiner ce bitmap avec JUST THE WHITE PARTS transformé en cette autre couleur» au moment de l'exécution. Y a-t-il quelque chose comme ça disponible? Je serai moins surpris si la réponse est «non», mais je me dis que cela vaut la peine de demander.

Répondre

1

Vous avez peut-être répondu à la question vous-même.

Je pense que votre première approche ne nécessiterait que deux images transparentes: une avec les pixels des parties qui doivent changer de couleur, l'autre avec le reste de l'image. Vous utiliserez le filtre colorTransform ou ColorMatrix par cas. Il peut même travailler avec avoir les pixels dont le changement de couleur doit être couvert avec Sprite avec un jeu de couleur plat sur la superposition? L'inconvénient serait que vous aurez besoin de créer une «carte de couleur»/ensemble de pixels à remplacer pour chaque élément différent qui aura besoin de remplacement de la couleur.

Pour la deuxième approche: Vous pouvez isoler les zones en utilisant quelque chose comme threshold(). Pour la vitesse, vous pouvez stocker les indices des pixels que vous devez remplacer dans un vecteur. <int> objet qui pourrait être utilisé en conjonction avec la méthode getVector() de BitmapData. (Vous devrez boucler une seule fois pour récupérer les indices de pixels qui doivent être remplacés)

Puisque vous utiliserez la même image (mêmes dimensions) pour remplir le même contenu avec une couleur différente, vous traverserez toujours les mêmes pixels . Gardez également à l'esprit que vous allez gagner un peu de vitesse en utilisant lock() avant votre boucle pour définir Pixel() et unlock() après la boucle.

Vous pouvez également utiliser Pixel Bender et essayer des techniques de soustraction d'écran vert/arrière-plan. Il devrait être rapide et ne retarderait pas l'exécution du reste de votre code as3 car le code de Pixel Bender s'exécute dans son propre thread.

Vérifiez également Lee's Pixel Bender technique de soustraction aussi.

Bien que ce soit un peu vieux maintenant, vous pouvez aussi utiliser quelques connaissances de @article de Quasimondo.

HTH

0

Je suis un peu confus lorsque vous voyez la différence entre votre deuxième approche et celle que vous aimeriez avoir. Vous pouvez parcourir votre bitmap chargé pixel par pixel et lire la couleur. S'il s'avère blanc, remplacez-le par une autre couleur. Je ne vois pas l'occurrence de la consommation de la mémoire multipliée.