Zum Inhalt

Ermitteln, wie viele Prozent einer Bitmap freigerubbelt wurden

Abb. 1: Transparentes Quadrat in Perlin-Noise-Bitmap
Lange Headline, wohl wahr. Aber die Aufgabe, die sich mir gerade stellt, ist auch nicht ganz ohne.
User sollen eine Bitmap „wegrubbeln“ können, um die darunter liegende andere Bitmap sehen zu können. Beim „Rubbeln“ werden eine gewisse Menge Pixel der verdeckenden Bitmap transparent gesetzt. Nun sollen User nicht jedes einzelne Pixel „wegrubbeln“ müssen; das würde vermutlich die Geduld der User zu sehr strapazieren. Vielmehr soll ab einer bestimmten Menge der Rest der verdeckenden Bitmap einfach ausgeblendet werden.
Aber wie ermittelt die Applikation, ob bereits diese Menge von der verdeckenden Bitmap „weggerubbelt“ wurde?

Zum Glück recht einfach: Indem man die BitmapData-Methode threshold() mit geeigneten Werten füttert.
Es folgt ein Skript, das aus der Flash-Referenz stammt und von mir nur geringfügig modifiziert wurde. Die zugehörige FLA (CS4, gezippt; 8kb) kann hier heruntergeladen werden.

Ausgabe dieses Beispiels
6 % der Pixel entsprechen dem Prüfmuster,
das sind 2500 Pixel.

Kleine Legende zur Abbildung
A: Gradient, um Transparenz deutlich zu machen
B: Perlin Noise-Fläche (200x200px)
C: Quadrat aus transparenten Pixeln (50x50px)

Ausführungen
Eigentlich würde (im Originalbeispiel) eine zweite Bitmap generiert werden, in die eine bestimmte Menge Pixel der ersten Bitmap kopiert werden. Da aber threshold() netterweise als Rückgabewert die Anzahl der durch die Operation veränderten Pixel hat, kann ich getrost auf diese zweite Bitmap verzichten. Ich lasse mir einfach die Menge der Pixel ausgeben, deren Alphawert kleiner ist als 0.01 (#01).

Da ich in diesem Test per verschachtelter FOR-Schleifen dafür gesorgt habe, dass es auf jeden Fall 2.500 transparente Pixel gibt (Z. 29-35), kann ich ganz gut überprüfen, ob der Rückgabewert der threshold-Methode korrekt ist. Tatsächlich wird ausgegeben, dass 2.500 Pixel dem Prüfmuster entsprechen.

In den meisten Situationen, wo User etwas „freirubbeln“ sollen, wird es unangebracht sein, ein Skript ähnlich dem hier vorgestellten mehrmals pro Sekunde ausführen zu lassen, um den Augenblick zu fixieren, wenn eine gewisse Prozentzahl Pixel „freigerubbelt“ worden sind, da es der Performanz der Applikation schaden würde.
Vermutlich wäre die Ausführung dieses Skripts bei MOUSE_UP ausreichend (was natürlich voraussetzt, dass bei MOUSE_DOWN der „Rubbelvorgang“ gestartet wird) — durch eine kurze IF-Abfrage wird geprüft, ob die ermittelte Prozentzahl der transparenten Pixel über der vorher definierten Grenze liegt. Wenn ja, kann zur Ausblende-Routine für den Rest (die nicht vom User „freigerubbelten“ Pixel) übergeleitet werden. Falls nicht, geht der Spaß beim nächsten MOUSE_DOWN weiter.

Piter Wilson (Juan Carlos Ospina Gonzalez) hat in seinem Blog schon vor einiger Zeit einen Artikel gepostet, wie man in AS3 so einen „Freirubbel“-Effekt umsetzen könnte: Bitmapdata erasing in as3 (with custom brush shape). Seine Lösung wirkt sehr kompliziert, aber eine andere aufzutreiben, ist mir bisher nicht gelungen.

Veröffentlicht inSpielprogrammierung
Loading Facebook Comments ...

Schreibe den ersten Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.


Warning: Declaration of sk2_rbl_plugin::treat_this($cmt_object) should be compatible with sk2_plugin::treat_this(&$cmt_object) in /www/htdocs/w00e0042/christianscholz.com/wp-content/plugins/SK2/sk2_plugins/sk2_rbl_plugin.php on line 342

Warning: Declaration of sk2_captcha_plugin::output_plugin_UI() should be compatible with sk2_plugin::output_plugin_UI($output_dls = true) in /www/htdocs/w00e0042/christianscholz.com/wp-content/plugins/SK2/sk2_plugins/sk2_captcha_plugin.php on line 70

Warning: Declaration of sk2_pjw_simpledigest::output_plugin_UI() should be compatible with sk2_plugin::output_plugin_UI($output_dls = true) in /www/htdocs/w00e0042/christianscholz.com/wp-content/plugins/SK2/sk2_plugins/sk2_pjw_daily_digest_plugin.php on line 277

Warning: Declaration of sk2_referrer_check_plugin::output_plugin_UI() should be compatible with sk2_plugin::output_plugin_UI($output_dls = true) in /www/htdocs/w00e0042/christianscholz.com/wp-content/plugins/SK2/sk2_plugins/sk2_referrer_check_plugin.php on line 78