论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

Flash as3类之ImageParser

文章类别:Flash AS | 发表日期:2009-8-9 12:10:40

Flash as3类之ImageParser

前一阵整理的一个Flash as3类。目前支持的格式有jpg,gif,png。有需要的可以用用,如果有什么错误也请告诉我。

名称:ImageParser
作者:Flashlizi(www.flashrek.com)
用途:在图片(jpg,gif,png格式)下载完成前获取图片尺寸。
说明:在Loader类中我们可以通过contentLoaderInfo来获取下载对象的各种信息,但是在下载过程中,我们并不能获取下载对象的width和height,只有等完成后才能获取。此类可以让你只下载很少数据量(1%或者更少)的时候就能获取图片的width和height,让你提前为图片准备合适尺寸的容器或者进行大小控制等操作。
附件内容:包含3个文件
ImageParser.as 本类,里面有注释
ImageLoader.as 改造的Loader类,使之在下载同时获取图片的width和height。
ImageLoader.fla 演示例子

直接使用示例:
复制内容到剪贴板代码:
import com.flashrek.utils.ImageParser;
//支持的图片格式为jpg/gif/png
var url:String="http://bbs.blueidea.com/images/blue/logo.gif";
var uq:URLRequest=new URLRequest(url);
var _IP:ImageParser=new ImageParser();
_IP.parse(uq);
_IP.addEventListener(ImageParser.PARSE_COMPLETE,sizeComplete);
_IP.addEventListener(ImageParser.PARSE_FAILED,sizeFailed);
function sizeComplete(evt:Event) {
    trace("contentDimensions:"+_IP.contentWidth+"x"+_IP.contentHeight);
}
function sizeFailed(evt:Event) {
    trace("contentDimensions has no parsed");
}
ImageParser.as代码:

/*
@Name:ImageParser.as
@Usage:在图片未下载完成前获取图像的图片,支持jpg,gif,png格式。因为有些图像信息格式并不完全
符合标准,因此不保证所有图片都能正确获取结果。
@Author:Flashlizi(www.flashrek.com)
@Date:2007-05-18
*/
package com.flashrek.utils{
 import flash.net.URLStream;
 import flash.net.URLRequest;
 import flash.events.Event;
 import flash.events.ProgressEvent;
 import flash.utils.Endian;
 public class ImageParser extends URLStream {
  /*HexTag 数据标记,每串标记作为标记数组里的一个元素
  leapLength 跳过的字节数
  fileType 文件类型
  parseComplete 解析完成标记
  contentHeight,contentWidth 目标高度和宽度
  isAPPnExist 标记JPG图片的APPn数据段是否存在,默认为无
  */
  protected static  const JPGHexTag:Array=[[0xFF,0xC0,0x00,0x11,0x08]];
  protected static  const PNGHexTag:Array=[[0x49,0x48,0x44,0x52]];
  protected static  const GIFHexTag:Array=[[0x21,0xF9,0x04],[0x00,0x2C]];;
  protected var APPnTag:Array;
  protected var HexTag:Array;
  protected var address:uint;
  protected var fileType:String;
  protected var byte:uint;
  protected var index:uint=0;
  protected var leapLength:uint;
  private var parseComplete:Boolean=false;
  private var match:Boolean=false;
  private var isAPPnExist:Boolean=false;
  public var contentHeight:uint;
  public var contentWidth:uint;
  public static  const PARSE_FAILED:String="PARSE_FAILED";
  public static  const PARSE_COMPLETE:String="PARSE_COMPLETE";
  public function ImageParser() {
  }
  //解析对象
  public function parse(uq:URLRequest):void {
   addEventListener(ProgressEvent.PROGRESS,parseHandler);
   addEventListener(Event.COMPLETE,completeHandler);
   fileType=uq.url.slice(uq.url.lastIndexOf(".") + 1).toLowerCase();
   switch (fileType) {
    case "png" :
     HexTag=PNGHexTag;
     break;
    case "jpg" :
     HexTag=JPGHexTag;
     APPnTag=new Array();
     break;
    case "gif" :
     //gif图像数据endian是LITTLE_ENDIAN
     endian=Endian.LITTLE_ENDIAN;
     HexTag=GIFHexTag;
     leapLength=4;
     break;
   }
   load(uq);
  }
  //解析数据流
  protected function parseHandler(evt:ProgressEvent):void {
   if (fileType == "jpg") {
    JPGAPPnMatch();
   } else {
    matchHexTag();
   }
   if (parseComplete) {
    dispatchEvent(new Event(PARSE_COMPLETE));
    removeEventListener(ProgressEvent.PROGRESS,parseHandler);
    if (connected) {
     close();
    }
   }
  }
  //解析完成
  protected function completeHandler(evt:Event):void {
   if (!contentWidth||!contentHeight) {
    dispatchEvent(new Event(PARSE_FAILED));
   }
  }
  //比较SOF0数据标签,其中包含width和height信息
  protected function matchHexTag() {
   var len:uint=HexTag.length;
   while (bytesAvailable > HexTag[0].length) {
    match=false;
    byte=readUnsignedByte();
    address++;
    if (byte == HexTag[0][index]) {
     //trace(byte.toString(16).toUpperCase());
     match=true;
     if (index >= HexTag[0].length - 1 && len == 1) {
      getWidthAndHeight();
      parseComplete=true;
      break;
     } else if (index >= HexTag[0].length - 1 && len > 1) {
      HexTag.shift();
      index=0;
      matchHexTag();
      break;
     }
    }
    if (match) {
     index++;
    } else {
     index=0;
    }
   }
  }
  //因为JPG图像比较复杂,有的有缩略图APPn标签里(缩略图同样有SOF0标签),所有先查找APPn标签
  protected function JPGAPPnMatch() {
   while (bytesAvailable > leapLength) {
    match=false;
    byte=readUnsignedByte();
    address++;
    if (byte == 0xFF) {
     byte=readUnsignedByte();
     address++;
     /*如果byte在0xE1与0xEF之间,即找到一个APPn标签
     APPn标签为(0xFF 0xE1到0xFF 0xEF)
     */
     if (byte >= 225 && byte <= 239) {
      isAPPnExist=true;
      //trace(byte.toString(16).toUpperCase());
      leapLength=readUnsignedShort() - 2;
      leapBytes(leapLength);
      JPGAPPnMatch();
     }
    }
    //APPn标签搜索完毕后即可开始比较SOF0标签
    if (byte != 0xFF && leapLength != 0) {
     matchHexTag();
     break;
    }
    /*如果超过一定数据还未找到APPn,则认为此JPG无APPn,直接开始开始比较SOF0标签。
    这里我取巧选了一个100作为判断,故并不能保证100%有效,但如重新解析的话效率并不好。
    如果谁有更有效的解决办法请告诉我,谢谢。
    */
    if (address > 100 && isAPPnExist == false) {
     matchHexTag();
     break;
    }
   }
  }
  //跳过count个字节数
  protected function leapBytes(count:uint):void {
   for (var i:uint=0; i < count; i++) {
    readByte();
   }
   address+= count;
  }
  //获取加载对象的width和height
  protected function getWidthAndHeight() {
   if (fileType == "gif") {
    leapBytes(leapLength);
   }
   switch (fileType) {
    case "png" :
     contentWidth=readUnsignedInt();
     contentHeight=readUnsignedInt();
     break;
    case "gif" :
     contentWidth=readUnsignedShort();
     contentHeight=readUnsignedShort();
     break;
    case "jpg" :
     contentHeight=readUnsignedShort();
     contentWidth=readUnsignedShort();
     break;
   }
  }
 }
}
  

视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058