`

大话Loader.loadBytes[渐进式加载]

阅读更多

第一话:加载Base64 encoded string
通过加载Base64 string创建图片。没错,就像你看到的,加载一个字符串也可以生成图片,当然不是说图片url是字符串(废话!),图片数据就在字符串中。
问题的关键是需要这么一个类Base64 ,它的converToByteArray方法可以把字符串转化为ByteArray,有了ByteArray数据,我们就可以生成图片了。

代码如下:
原文件出处:Loading Image using Loader.loadBytes()


//http://www.motobit.com/util/base64-decoder-encoder.asp
//你可以在线把一张小图片转为base64 string,把字符串粘贴到这里赋值给变量str
//过些天做个有输入框的实例,可以把你得到的字符串粘到里面,生成图片
var str:String = "";
var byteArr:ByteArray = Base64.converToByteArray(str);

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
loader.loadBytes(byteArr);

function onImageLoaded(e:Event):void{
        addChild(loader);
        trace(loader.width + " : " + loader.height);
}


第二话:简单渐进式加载图片类ByteLoader
上面只是为了给大家开开眼界,不表。你可能会说“我的目的很简单,我只是要加载一张图片,用渐进的方式边加载边显示,我可不知道哪里有一串字符串让我去加载。”
嗯,来看看这个类吧,ByteLoader继承Loader类,使用方法跟Loader类一样简单。


var bl:ByteLoader = new ByteLoader();
addChild(bl);
bl.loadUrl("big.jpg");


原理是:

  1. 用URLStream类去加载图片数据流,
  2. 然后用帧循环stream.readBytes(data, data.length)将数据读入ByteArray中;
  3. 同时在帧循环中卸载Loader中旧的数据,加载新的数据super.unload();super.loadBytes(data);

代码如下:


package {
	import flash.events.EventDispatcher;
	import flash.events.ProgressEvent;
	import flash.events.Event;
	import flash.utils.ByteArray;
	import flash.net.URLStream;
	import flash.net.URLRequest;
	import flash.display.Loader;

	public class ByteLoader extends Loader{
		public var url:String;
		public var data:ByteArray;
		private var stream:URLStream;

		public function ByteLoader(url:String = ""){
			if(url != ""){
				loadUrl(url);
			}
		}
		//加载
		public function loadUrl(_url:String):void{
			url = _url;
			data = new ByteArray;
			stream = new URLStream;
			stream.load(new URLRequest(url));
			stream.addEventListener(Event.COMPLETE,completeFun);
			stream.addEventListener(ProgressEvent.PROGRESS,progressFun);

			addEventListener(Event.ENTER_FRAME,loaddata);
		}
		private function loaddata(e:Event):void{
			if (stream.bytesAvailable > 0){
				stream.readBytes(data, data.length);
			}
			if (data.length > 0){
				super.unload();
				super.loadBytes(data);
			}
		}
		//加载中
		private function progressFun(e:ProgressEvent):void{
			if(stream.bytesAvailable == 0) return;

			dispatchEvent(e);
			trace(e.bytesLoaded);
		}
		//加载完成
		private function completeFun(e:Event):void{
			stream.removeEventListener(Event.COMPLETE,completeFun);
			stream.removeEventListener(ProgressEvent.PROGRESS,progressFun);

			dispatchEvent(e);
			this.closeStream();
		}
		//清除数据
		public function closeStream():void{
			if (stream){
				if (stream.connected) stream.close();
			}
			if (hasEventListener(Event.ENTER_FRAME)){
				removeEventListener(Event.ENTER_FRAME, loaddata);
			}
		}

	}
}

第三话:更周详的渐进式加载类ProgressiveLoader
原文件出处:ProgressiveLoader 渐进式加载图像
这个类,核心跟我上面那个ByteLoader类是一样的。只是这个类作了更多的考虑,也重写了父类Loader的几个方法。原文有个实例,大家可以去看看。
原代码,好长啊!自己下载 吧。
Base64类也有得下载

分享到:
评论

相关推荐

    flex 打开本地图片

    flex 打开本地图片并进行显示 var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.onLoadByted);... loader.loadBytes(this.fileReference.data);

    Flex运行时加载ICON

    ` 或 `loader.loadBytes(yourImageData);` 3. 添加事件监听器以跟踪加载进度和完成情况:`loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);` 4. 定义加载完成后的处理函数:`function ...

    flash加载外部图片

    import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; ``` - 创建Loader对象并指定要加载的图片URL。 ```actionscript var loader:Loader = new Loader(); var ...

    flash资源加载策略

    - 当使用Loader加载资源时,资源会被实例化,占用更多内存,因此需要权衡加载速度和内存管理。 - 对于大的或不常用的资源,考虑延迟加载或按需加载,以提高用户体验。 - 如果多个SWF共享同一个应用域,确保链接名的...

    FLEX代码,图片调用

    import flash.display.Loader; public class ByteArrayImage extends mx.controls.Image { private var _loader: Loader = new Loader(); public function ByteArrayImage(): void {} override protected...

    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机

    我们可以使用`Loader`加载图片: ```actionscript private function onSelect(event:MediaEvent):void { var promise:MediaPromise = event.data as MediaPromise; _loader = new ExifLoader(); _loader....

    通过ByteArray来播放MP3

    要通过`ByteArray`播放MP3文件,我们首先需要创建一个包含MP3文件的SWF文件,然后使用`Loader.loadBytes()`方法来加载这个SWF文件。 ### 创建包含MP3的SWF文件 为了演示如何将MP3文件嵌入到SWF文件中,我们可以...

    php与flash as3 socket通信传送文件实现代码

    前段时间在flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件… 当时还没有出as3的反...前台swf适用Loader.loadBytes方法显示主程序文件. 下面是测试的源程序: package { import flas

    AS3.0的加载机制

    4. **loadBytes(bytes: ByteArray, context: LoaderContext = null)**:通过提供一个`ByteArray`对象来加载数据,这对于从内存中加载资源非常有用。 5. **unload()**:卸载当前Loader实例加载的数据,释放资源。 6...

    ForcibleLoader.as 将加载的version 9以下的swf转换成version 9以上的swf

    在AS3中,我们通常使用`Loader` 类来加载SWF、图像、XML等资源。然而,`Loader` 默认情况下仅能加载与当前项目相同或更低版本的SWF。`ForcibleLoader` 类通过覆盖`Loader` 的某些关键方法,实现了对低版本SWF的转换...

    AS3动态加载字体

    但是,直接使用`loadBytes()`方法加载字体字节数组可能导致安全沙箱问题,因此需要在正确的位置和方式下进行操作。 `Main.as`和`FontLibrary.as`是两个关键的文件。`Main.as`通常作为主入口文件,负责初始化和协调...

    flash 上传头像

    `Loader.loadBytes()`方法接收`FileReference`对象的`data`属性(即用户选择文件的二进制数据),加载完成后,图片可以在舞台上进行展示。 4. **图片裁剪**:为了适应不同的头像尺寸要求,通常会添加裁剪功能。这...

    Flex 上传图片 预览 加载图片到内存

    要将`ByteArray`加载到内存,我们可以创建一个`BitmapData`实例,调用其`loadBytes()`方法,传入`ByteArray`对象。这样,图片数据就被加载到内存中,可供后续处理,如缩放、裁剪、滤镜效果等。 4. **性能优化**: ...

    AS3 PNG图片转二进制

    将图片数据保存为二进制后,可以使用Loader对象的loadBytes()方法加载这些数据。加载完成后,可以通过 addChild() 方法将其添加到舞台上显示。 7. **性能优化**: 二进制加载相比传统的URLLoader加载图片更高效,...

    本地播放器(ActionScript 3.0实现)

    1. **加载媒体文件**:ActionScript 3.0中的`flash.net`包提供了`Loader`类,可以用来加载各种类型的二进制数据,包括音频和视频文件。通过`LoaderContext`,我们可以设置加载策略,如允许跨域访问或者指定安全沙箱...

    LINQPad_Premium_5.36.03_Any_CPU 含破解

    These methods are Util.SaveString, Util.SaveBytes, Util.LoadString, and Util.LoadBytes. LINQPad's embedded ILSpy has now been updated to V4. You can now enable or disable compiler optimizations on a ...

    LINQPad Premium 5.36.03 (Any CPU)

    有在LINQPad的的Util类新方法来加载/字符串或字节数组保存到一个中央计算机存储(查询之间共享)。这些方法Util.SaveString,Util.SaveBytes,Util.LoadString和Util.LoadBytes。 LINQPad的嵌入式ILSpy现在已经更新...

    赛尔号发包例子以及逆向过程-易语言

     this._loader.loadBytes(byteArray,new LoaderContext(false,ApplicationDomain.currentDomain));  } 思路清晰,可以干代码,这里使用了易语言 导出文件 可以,再将其导入FFdec看看效果。解压后,开始找与通讯的...

    pixel_bender_basics.zip_adobe flash_pixelbender_roundwps

    1. 加载PBK文件:首先,你需要使用`loadBytes()`方法加载PBK文件内容,然后通过`Pixel Bender Loader`类解析这个字节数据。 2. 创建滤镜实例:解析完成后,你可以创建一个`Pixel Bender Filter`实例,传入解析出的...

Global site tag (gtag.js) - Google Analytics