Archive pour la catégorie 'AS3'

Google Maps API pour Flash CS3

Sunday 1 June 2008

Bien qu’il existe une API d’utilisation de Google Maps en AS3 celle-ci ne reste utilisable qu’à partir du flex SDK.

Cependant il existe un petit hack pour l’utiliser depuis l’environnement Flash grâce à une bien belle nouveauté de l’AS3 : le getDefinition.

Il faut tout d’abord télécharger le composants SWC fournit par Google.

Ce fichier SWC est en fait une archive contenant un SWF compilé avec toutes les classes d’utilisations de Google Maps. En l’ouvrant avec winrar par exemple vous pourrez extraire le fichier “library.swf” et le garder bien avec vous.

L’étape suivante consistera à charger “library.swf” et à récupérer les classes pour pouvoir utiliser notre google map.


function GoogleMaps ( ) {
var libraryLoader : Loader = new Loader();
libraryLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, configureLibrary);
libraryLoader.load(new URLRequest("gmaplibrary.swf"));
}

public function configureLibrary ( e : Event ) : void
{
e.target.addEventListener(Event.COMPLETE, configureLibrary);

Security.allowDomain("*"); // permet a google d'acceder a notre swf.

var appDomain : ApplicationDomain = e.target.applicationDomain;

Map = appDomain.getDefinition("com.google.maps.Map") as Class;
MapEvent = appDomain.getDefinition("com.google.maps.MapEvent") as Class;
MapType = appDomain.getDefinition("com.google.maps.MapType") as Class;
LatLng = appDomain.getDefinition("com.google.maps.LatLng") as Class;
MapMouseEvent = appDomain.getDefinition("com.google.maps.MapMouseEvent") as Class;
ZoomControl = appDomain.getDefinition("com.google.maps.controls.ZoomControl") as Class;
PositionControl = appDomain.getDefinition("com.google.maps.controls.PositionControl") as Class;

myMap = new Map();

myMap.key = '‘;
myMap.addEventListener(MapEvent.MAP_READY, _onMapReady);
myMap.setSize(new Point(800,350));
addChild(myMap);
}

protected function _onMapReady ( e ) : void
{
myMap.removeEventListener(MapEvent.READY, _onMapReady);

myMap.enableScrollWheelZoom();
myMap.enableContinuousZoom();
myMap.setCenter(new LatLng(48.25, 11.00), 4, MapType.NORMAL_MAP_TYPE);
myMap.addControl(new PositionControl());
myMap.addControl(new ZoomControl());
}

Vous devrez récupérer une clé d’utilisation en cliquant ici. Elle vous permettra d’utiliser Google Map sur un nom de domaine donné.

C’est une solution un peu sale, étant donné que le typage des Class devient impossible, il faudra être minutieux afin d’éviter les erreurs.

J’ai aussi tenté de décompilé le “library.swf” avec SWF Decompiler afin d’utiliser les classes directement, mais le code est trop complexe, le code décompilé est buggué et inutilisable… dommage.

Téléchargez ici l’exemple complet.

Mots Clés:

JPGEncoder en 300 dpi

Wednesday 21 May 2008

J’ai eu affaire ces derniers jours à la class JPGEncoder (contenue dans le corelib fourni par adobe) en AS3 qui permet d’encoder du bitmap depuis vers au format JPG. Pratique me direz vous ! La ou il fallais 20 secondes pour générer 1000px en AS2 via une passerelle AS2 en lui passant les données pixels toutes les 2 secondes pour éviter un crash, on peux maintenant exporter 3Mpixels en moins de 3 secondes.

Tutorial d’utilisation de la class JPGEncoder.

Mais voilà Adobe a prévu leur class seulement pour exporter seulement du 72dpi. Pas très pratique lorsqu’on exporter un JPG de stickers pour l’imprimer par la suite.

Après quelques longues recherches sur le format JPG et ses spécificités j’ai pu modifier le script JPGEncoder afin qu’il exporte en 300dpi. Il est possible d’encoder directement en 300dpi sans passer par Photoshop comme certains me le conseillais !

Pour cela, rendez vous ligne 400. Lors de l’écriture d’un des header du format JPG (APP0, marqueurs qui défini des spécificité)
Remplacez le 10ème byte écrit ligne :
writeByte(0); // xyunits -> writeByte(1); // xyunits
puis les lignes suivantes :
writeWord(1); // xdensity -> writeWord(0×12c); // xdensity défini la densité de pixel en x en hexadecimal (0×12c = 300)
writeWord(1); // ydensity -> writeWord(0×12c); // ydensity défini la densité de pixel en y en hexadecimal (0×12c = 300)

Votre export sera alors bien du 300dpi !

Mots Clés: