ImageParser(加载完成前获取图片尺寸)

2024-05-21 02:38

本文主要是介绍ImageParser(加载完成前获取图片尺寸),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import ImageParser;
//支持的图片格式为jpg/gif/png
var url:String = "1.jpg";
var uq:URLRequest = new URLRequest(url);
var _imgPar:ImageParser=new ImageParser();
_imgPar.parse(uq);
_imgPar.addEventListener(ImageParser.PARSE_COMPLETE,sizeComplete);
_imgPar.addEventListener(ImageParser.PARSE_FAILED,sizeFailed);
function sizeComplete(evt:Event)
{trace("contentDimensions:"+_imgPar.contentWidth+"*"+_imgPar.contentHeight);
}
function sizeFailed(evt:Event)
{trace("contentDimensions has no parsed");
}

ImageParser.as

/*
@Name:ImageParser.as
@Usage:在图片未下载完成前获取图像的图片,支持jpg,gif,png格式。
*/
package{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_ENDIANendian=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和heightprotected 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;}}}
}


这篇关于ImageParser(加载完成前获取图片尺寸)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995996

相关文章

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"