AS3的JPGDecoder

不知道为什么,使用flex开发 IOs下的应用,碰到了Loader.loadBytes无法使用的情况,也不能Loader.load

被逼无奈,只好找了一个JPGDecoder类,自动解码使用FileStream读取的图片二进制

使用Alchemy开发的,效率一般,没有as3自己的Loader类效率高,特别是大尺寸图片的时候,是同步解码的,先就凑合用一下吧

准备打算用纯as3来开发IOs应用了,感觉Flex的效率太低了

/**
 * __    ___  __ ___   ___                   _           
   \ \  / _ \/__\ _ \ /   \___  ___ ___   __| | ___ _ __ 
    \ \/ /_)/_\/ /_\// /\ / _ \/ __/ _ \ / _` |/ _ \ '__|
 /\_/ / ___//__ /_\\/ /_//  __/ (__ (_) | (_| |  __/ |   
 \___/\/   \__\____/___,' \___|\___\___/ \__,_|\___|_|
 
 * This class lets you decode a JPEG stream in ActionScript 3 in Flash Player 10
 * @author Thibault Imbert (bytearray.org)
 * @version 0.2 - Removed unuseful setters.
 * @version 0.3 - If needed, stream can now be passed when JPEGDecoder is instanciated.
 * @version 0.4 - Check file header before processing it.
 */

package org.bytearray.decoder
{
	import cmodule.jpegdecoder.CLibInit;
	
	import flash.utils.ByteArray;
	
	public final class JPEGDecoder
	{
		private var loader:CLibInit;
		private var lib:Object;
		private var ns:Namespace;
		private var memory:ByteArray;
		private var infos:Array;
		private var position:uint;
		private var length:uint;
		private var buffer:ByteArray = new ByteArray();
		
		private var _pixels:Vector.<uint>;
		private var _width:uint;
		private var _height:uint;
		private var _numComponents:uint;
		private var _colorComponents:uint;
		
		public static const HEADER:int = 0xFFD8;
		
		public function JPEGDecoder ( stream:ByteArray=null )
		{
			if ( stream != null ) parse( stream );
		}
		
		/**
		 * Allows you to inject a JPEG stream to decode it. 
		 * @param stream
		 * @return 
		 */		
		public function parse ( stream:ByteArray ):Vector.<uint>
		{
			stream.position = 0;
			if ( stream.readUnsignedShort() != JPEGDecoder.HEADER )
				throw new Error ("Not a valid JPEG file.");
			loader = new CLibInit();
			loader.supplyFile("stream", stream);
			lib = loader.init();
			
			ns = new Namespace("cmodule.jpegdecoder");
			memory = (ns::gstate).ds;
			infos = lib.parseJPG ("stream");
			
			_width = infos[0];
			_height = infos[1];
			_numComponents = infos[2];
			_colorComponents = infos[3];
			position = infos[4];
			length = width*height*3;
			
			buffer.length = 0;
			buffer.writeBytes(memory, position, length);
			buffer.position = 0;
			
			var lng:uint = buffer.length;
			_pixels = new Vector.<uint>(lng/3, true);
			var count:int;
			
			for ( var i:int = 0; i< lng; i+=3 )
				pixels[int(count++)] = (255 << 24 | buffer[i] << 16 | buffer[int(i+1)] << 8 | buffer[int(i+2)]);
			
			return pixels;
		}

		public function get pixels():Vector.<uint>
		{
			return _pixels;
		}

		public function get colorComponents():uint
		{
			return _colorComponents;
		}

		public function get numComponents():uint
		{
			return _numComponents;
		}

		public function get height():uint
		{
			return _height;
		}

		public function get width():uint
		{
			return _width;
		}
	}
}


下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
as3xls是一个用于ActionScript 3的开源库,用于读取Excel文件。通过as3xls,我们可以解析Excel文件并访问其中的数据。 在使用as3xls读取Excel文件之前,需要下载并导入as3xls库。然后,我们可以按照以下步骤读取Excel文件: 1. 创建FileReference对象,并使用其load()方法加载Excel文件。 2. 通过FileReference对象的Event.COMPLETE事件监听器,在文件加载完成后,获取Excel文件的字节数组。 3. 创建一个ExcelFile对象,并使用其loadFromByteArray()方法加载Excel文件的字节数组。 4. 使用ExcelFile对象的getSheetAt()方法选择要读取的表格。 5. 遍历选定的表格,使用getCell()方法获取每个单元格的数据。 6. 将单元格的数据存储在适当的数据结构中,可以是数组、对象或其他方式。 以下是一个简单的示例代码,演示如何使用as3xls读取Excel文件: ``` import com.as3xls.xls.ExcelFile; import com.as3xls.xls.Sheet; var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, onSelectFile); fileRef.addEventListener(Event.COMPLETE, onCompleteLoad); function onSelectFile(event:Event):void { fileRef.load(); } function onCompleteLoad(event:Event):void { var fileData:ByteArray = fileRef.data; var excelFile:ExcelFile = new ExcelFile(); excelFile.loadFromByteArray(fileData); var sheet:Sheet = excelFile.getSheetAt(0); // 选择第一个表格 for (var rowIndex:int = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) { for (var colIndex:int = 0; colIndex < sheet.getPhysicalNumberOfCells(); colIndex++) { var cellData:Object = sheet.getCell(rowIndex, colIndex).value; // 将单元格数据存储在适当的数据结构中 } } } ``` 使用上述代码,我们可以读取Excel文件并访问其中的数据。请注意,as3xls库还提供其他辅助方法,可以根据需要进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值