2009-09-03 7 views
1

J'importe des images dynamiquement dans un fichier SWF à partir d'un site externe utilisant AS2. Cela fonctionne parfaitement lorsque je charge mes images à partir de mon ordinateur, mais lorsque j'essaie de les charger à partir du serveur externe, le lissage ne fonctionne pas.Redimensionnement et lissage de l'image

Mon code:

var imageLoad:MovieClipLoader = new MovieClipLoader(); 
    imageLoad.addListener({ 
     onLoadInit:function (target:MovieClip) { 
      target._quality = "BEST"; 
      target._width = 160; 
      target._yscale = target._xscale; 
      if (target._height>105) { 
       target._height = 105; 
       target._xscale = target._yscale; 
      } 
      target.forceSmoothing = true; 
     } 
    }); 
imageLoad.loadClip(imageURL,imageMC); 

J'ai essayé toutes les solutions que je pouvais trouver sur le net, et personne ne travaille avec lissage ...

Toute solution à cela?

Répondre

1

AS2 ... euh ... les souvenirs (plus comme des cauchemars). Essayez mon "bon vieux" BitmapLoader.as ... Je l'utilise depuis de nombreuses années et ne m'a jamais manqué ... Ce n'est pas magnifiquement écrit et il y a quelques setters à double portée. .. mais je m'en fous. C'est vieux, et il a parfaitement fait son travail (toujours!). Il a besoin d'un booléenne dans le constructeur qui définit le lissage à vrai ou faux

import flash.display.BitmapData; 

class BitmapLoader extends Object { 

    private var mLoader : MovieClipLoader; 
    private var scope : Object; 
    private var _mc : MovieClip; 
    private var _url : String; 
    private var _func : Object; 
    private var smooth : Boolean; 

    public function BitmapLoader(smooth : Boolean) 
    { 
     this.smooth = smooth; 
     mLoader = new MovieClipLoader(); 
     addListener(this);  
    } 

    public function addListener(inListener : Object) : Void 
    { 
     mLoader.addListener(inListener); 
     scope = inListener; 
    } 

    public function removeListener(inListener : Object) : Void 
    { 
     mLoader.removeListener(inListener); 
    } 

    private function onLoadInit(inTarget : MovieClip) : Void 
    { 
     var bitmap : BitmapData = new BitmapData(inTarget._width, inTarget._height, true, 0x000000);  
     bitmap.draw(inTarget); 
     var parent : MovieClip = inTarget._parent; 
     var img : MovieClip = parent.createEmptyMovieClip("imageloader_smooth_mc", parent.getNextHighestDepth()); 
     inTarget.unloadMovie(); 
     inTarget.removeMovieClip(); 
     delete inTarget; 
     img.attachBitmap(bitmap, img.getNextHighestDepth(), "never", true); 
     scope[_func](img); 
    } 

    private function onLoadError(errorCode : String, httpStatus : Number) : Void 
    { 
     error(errorCode, httpStatus); 
    } 

    /** 
    * loadBitmap(http://www.test.nl/img.jpg, movieclip, "dothis"); 
    */ 
    public function loadBitmap(url : String, mc : MovieClip, func : Object) : Void 
    { 
     _url = url; 
     _mc = mc; 
     _func = func; 
     var raw : MovieClip = _mc.createEmptyMovieClip("imageloader_raw_mc", _mc.getNextHighestDepth()); 
     mLoader.loadClip(_url, raw); 
    } 

    private function error(errorCode : String, httpStatus : Number) : Void 
    { 
     var raw : MovieClip = _mc.createEmptyMovieClip("imageloader_raw_mc", _mc.getNextHighestDepth()); 
     mLoader.loadClip("img/notfound.jpg", raw); 
    }; 
} 

Vous pouvez utiliser cette classe comme ceci:

var loader : BitmapLoader = new BitmapLoader(true); 
loader.addListener(this); 
loader.loadBitmap("http://test.nl/example.jpg", this, "doneLoading"); 

'true' est le lissage booléenne, addListener (this) est d'éviter les problèmes de portée (AS2-bleeh) et "doneLoading" est le nom de la fonction qu'il appelle quand il est chargé.

Espérons que cela fonctionne pour toi.

Bonne chance! Que diriez-vous de le dessiner sur un autre BitmapData avec une matrice de mise à l'échelle?

+0

Vous pouvez le faire dans la fonction 'doneLoading'. i.e. .: \t fonction publique doneLoading (mc: MovieClip): Void { \t \t \t mc._width = 160; \t \t mc._yscale = mc._xscale; \t \t si (cible._height> 105) \t \t { \t \t \t mc._height = 105; \t \t \t mc._xscale = target._yscale; \t \t} \t} – Ypmits

1

Pas sûr, mais le problème que vous avez semble être symptomatique d'un problème inter-domaines. Vous ne pourrez pas modifier les propriétés SWF chargées (lissage dans ce cas) si elles proviennent d'un domaine différent, sauf si un fichier de régulation inter-domaines le permet.

Si ce n'est pas le problème, je me souviens de dessiner radicalement le bitmapData a toujours fait l'affaire. Si le résultat est une image noire, vous êtes généralement sûr d'avoir un problème inter-domaines. Cet article explique la technique précisément pour AS2:

http://www.kaourantin.net/2005/12/dynamically-loading-bitmaps-with.html

+0

Crossdomain n'est pas un problème, car le serveur auquel je parle a un fichier crossdomain.xml. Le problème avec ce code est que je ne peux pas l'obtenir pour redimensionner mes images, comme je le fais dans mon code. Des idées comment je voudrais utiliser ce code pour redimensionner les iamges? –

1

J'ai entendu qu'il sera plus lisse que la mise à l'échelle de la Bitmap elle-même ...

Le code ci-dessous est de here.

// source in this example is a DisplayObject 
var temp:BitmapData = new BitmapData(sourceWidth, sourceHeight); 
temp.draw(source); 

var output:BitmapData = new BitmapData(outputWidth, outputHeight); 

var matrix:Matrix = new Matrix(); 
matrix.scale(outputWidth/sourceWidth, outputHeight/sourceHeight); 

output.draw(temp, matrix, null, null, null, true); 
temp.dispose(); 
Questions connexes