Snapshots aus Flash

Wie schon in einem früheren Blogbeitrag beschrieben, lassen sich Screenshots mit der Hilfe der Bitmap- und BitmapData-Klassen bewerkstelligen. Darauf aufbauend lassen sich diese Bilder auch weiter benutzen. Das heißt, die Bilder als PNG oder JPG in einen Browser laden, zum download bereit stellen oder wieder in Flash laden.

Zunächst werden die Bilddaten in ein BitmapData-Object gezeichnet, welches den Abmessungen des Screenshots entspricht. Adobe hat mit seinen Klassen JPGEncoder und PNGEncoder zwei Klassen bereitgestellt, welche die Umrechnung in die jeweiligen Formate erledigt. Dazu übergibt man der encode()-Methode der jeweiligen Klasse das erstellte BitmapData-Objekt als Parameter und bekommt als Rückgabewert einen ByteArray.

Der nächste Schritt, um den ByteArray zu einem Bild zu wandeln, ist die Kodierung des ByteArrays als String, um diesen an PHP als POST-Daten senden zu können. Mit Hilfe der Klasse Base64 as dem Package com.dynamicflash.util wird der erstellte ByteArray in einen solchen String gewandelt. Das ganze geschieht mit der encodeByteArray-Methode, welche als Parameter eben diesen ByteArray bekommt und den dazu passenden String zurück liefert.

Als letzten Schritt dieser Prozedur wird nun der erstellte Bilddaten-String mittels PHP gesichert. Dazu wird ein neuer URLRequest erstellt welcher als method POST bekommt. Des weiteren ist eine URLVariable nötig, welche das Format (JPG, PNG), die Action (Load, Save, open in Browser), den Dateinamen sowie den Bilddaten-String enthält. Diese wird dem URLRequest zugewiesen. Sollte das Bild wieder in Flash geladen werden, ist hier ein Loader nötig, andernfalls reicht ein einfaches navigateToURL(urlRequest, ‚_blank‘) um das Bild zu sichern oder in einen Browser zu laden.

Mit dieser Möglichkeit kann man direkt verschiedene Ansichten, Videos oder Animationen aus Flash heraus sichern. Einfache Grafikprogramme auf Flashbasis wären so möglich, aber auch Spiele in denen der User zu jedem beliebigen Zeitpunkt einen Screenshot der Szene machen kann. Auch kann das Bild wiederum über z.B. eine Matrix transformiert oder darauf verschiedenste Filter angewendet werden.

Flash: ExternalInterface

ExternalInterface bietet dem Entwickler von Flash eine Schnittstelle zwischen ActionScript und dem Container der den Flash-Player enthält. Im besonderen können hiermit JavaScript-Funktionen in HTML-Seiten aufgerufen werden.

ExternlInterface bietet nicht nur einen Aufruf von Funktionen außerhalb von Flash, sondern hiermit können auch Rückgabewerte zurück an Flash geliefert werden. Auch der Weg vom Flash-Player-Container zu ActionScript ist möglich. Das heißt, bestimmte Funktionen können in ActionScript zum Beispiel mittels JavaScript aufgerufen wegen mit Parameter-Übergabe. Die zwei hierfür verwendeten Methoden sind die addCallback- und call-Methoden. Die addCallBack-Methode ermöglicht den Aufruf von AS-Funktionen von außen, call den Weg anders herum.

Die Parameter von ExternalInterface.addCallBack sind erstens der Name mit dem die Funktion von außen aufgerufen werden kann, zweitens das Objekt auf das sich die Methode bezieht und drittens die Methode die zur weiteren Verarbeitung aufgerufen wird. Die Verknüpfung erfolgt wie das Beispiel von Adobe zeigt:

<script>
function callExternalInterface() {
thisMovie("externalInterfaceExample").goHome();
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>

Hier müssen das id-Attribut (Object-Tag) und das name-Attribut (Embed-Tag) den Wert “externalInterfaceExample“ haben.

Mit ExternalInterface.call können wie gesagt Funktionen aufgerufen werden. Call hat zwei Parameter. Zum Einen dem Funktionsnamen und zum Anderen einen optionalen Parameter. Auch kann mit der call-Methode ein Rückgabewert abgefangen und weiterverarbeitet werden.

Diese beiden Methoden bieten ein die Möglichkeit einer einfachen Implementierung einer Schnittstelle in Flash, die sich vorwiegend für die Kommunikation mit JavaScript, aber auch anderen Sprachen wie C, anbietet. Die Anwendungsgebiete hierfür sind sehr zahlreich und reichen vom einfachen Auslesen der Browserinnengröße bis zur Verwendung einer Flash-Navigation in Web 2.0 Seiten.

Flash CS3 Skin Template

Wie in meinem letzten Artikel erwähnt, waren Jürgen und Ich bei der Adobe onAIR tour in München. Dort habe ich Lee (einem der Referenten von Adobe) das Problem mit dem Illustrator CS3 Skin Template geschildert. Es scheint nichts neues zu sein dass die Templates nicht richtig funktionieren.

Auf sein Anraten hin habe ich nun das Flex Extension Kit für Flash CS3 installiert und das mitgelieferte Template genutzt. Leider muss ich sagen das es keinen tick besser funktioniert als das Illustrator Template. Im Gegenteil, hier kommt noch hinzu das der PopUpButton nicht richtig dargestellt wird. Ein weiterer Versuch war, einzelne Komponenten anstatt des gesamten Templates zu verwenden. Aber auch hier ein Bild des jammers, das Panel versagt leider komplett und dadurch verhagelt es die gesamte Testanwendung.

Ich werde also weiterhin mit dem Illustrator Template arbeiten und auf schöne Tweens und Effekte leider verzichten müssen. Der Bug-Report an Adobe wird von mir die nächsten Tage noch rausgehen mit der Hoffnung das bald Besserung eintritt.