2009-09-03 6 views
1

Я импортирую некоторые изображения динамически в SWF с внешнего сайта с использованием AS2. Он отлично работает при загрузке изображений с моего компьютера, но когда я пытаюсь загрузить их с внешнего сервера, сглаживание не работает.Масштабирование изображения и сглаживание

Мой код:

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); 

Я опробовал все решения я смог найти в сети, и ни один не работал со сглаживанием ...

Любое решение этого?

ответ

1

AS2 ... ах ... воспоминания (больше как кошмаров).

Попробуйте мой «добрый» BitmapLoader.as ... Я использовал его в течение многих лет и никогда не подводил меня ... Это не красиво написано, и есть некоторые двойные средства настройки. .. но мне все равно. Он старый, и он отлично справился с работой (всегда!). Она нуждается в Boolean в конструкторе, который устанавливает сглаживание истинной или ложной

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); 
    }; 
} 

Вы можете использовать этот класс, как это:

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

«истинный» является сглаживающим-логическое значение, добавления слушателя (это) заключается в том, чтобы предотвратить проблемы с областью (AS2-bleeh), а «doneLoading» - это имя функции, которое она вызывает при загрузке.

Надеюсь, что это работает на ya.

Удачи вам!

+0

Вы можете сделать это в функции «doneLoading». т.е .: \t публичной функция doneLoading (MC: MovieClip): Пустота \t { \t \t mc._width = 160; \t \t mc._yscale = mc._xscale; \t \t если (цель._height> 105) \t \t { \t \t \t mc._height = 105; \t \t \t mc._xscale = target._yscale; \t \t} \t} – Ypmits

1

Не уверен, но проблема, с которой вы сталкиваетесь, является симптомом междоменной проблемы. Вы не сможете изменять загруженные SWF-свойства (сглаживание в этом случае), если они происходят из другого домена, если это разрешает файл политики междоменной политики.

Если это не проблема, я помню, как радикально рисовать bitmapData всегда делал трюк. Если результатом является черное изображение, то вы, в основном, уверены, что имеете междоменную проблему. В данной статье описывается метод именно для AS2:

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

+0

Crossdomain не является проблемой, так как сервер, с которым я разговариваю, имеет файл crossdomain.xml. Проблема с этим кодом заключается в том, что я не могу заставить его изменять размеры моих изображений, как в моем коде. Любые идеи, как я буду использовать этот код для изменения размеров iamges? –

1

Как рисовать его на другом BitmapData с матрицей масштабирования? Я слышал, что он будет более плавным, чем масштабирование самого растрового изображения ...

Код ниже - от 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(); 
Смежные вопросы