我正在使用AS2从外部站点动态地将一些图像导入SWF。 当我从计算机加载图像时它非常有效,但是当我尝试从外部服务器加载它们时,平滑效果不起作用。
我的代码:
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);
我已经尝试了我能在网上找到的所有解决方案,没有人使用平滑...
对此有任何解决方案吗?
答案 0 :(得分:1)
不确定,但您遇到的问题似乎是跨域问题的症状。如果除非跨域策略文件允许,否则您将无法修改加载的SWF属性(在这种情况下为平滑),如果它来自不同的域。
如果那不是问题,我记得从根本上绘制bitmapData总是做到了。 如果结果是黑色图像,那么您肯定会遇到跨域问题。 本文精确地解释了AS2的技术:
http://www.kaourantin.net/2005/12/dynamically-loading-bitmaps-with.html
答案 1 :(得分:1)
AS2 ......啊......回忆(更像是噩梦)。
尝试我的'好老'BitmapLoader.as ...我已经使用了很多年了,但我从来没有让我失望过......它编写得不精美,并且那里有一些双范围的设置器。但我不在乎。这是旧的,它完美地完成了它的工作(总是!)。它在构造函数中需要一个布尔值,它将平滑设置为true或false
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" );
'true'是smoothing-boolean,addListener(this)是为了防止范围问题(AS2-bleeh),而“doneLoading”是它在加载时调用的函数名。
希望这适用于你。
祝你好运!答案 2 :(得分:1)
如何使用缩放矩阵在另一个BitmapData上绘制它? 我听说它比缩放Bitmap本身更顺畅......
以下代码来自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();