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

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2