? ? 现在要求把后台bmp格式的图片,在flash中显示。如大家所知的,Flash已经内置了对jgp,png,gif图片的支持。不知道Adobe怎么想的,为啥不支持bmp呢。唉,bmp真是个苦命的孩子啊。
???? 不过还好有解决方案:以二进制的形式,把图片从后台加载到前台,然后通过bmp本身的格式进行解析,解析成为Flash认识的格式(BitMapData),然后就可以使用了哈,废话不多说了,看实例(加载24位bmp):
AS3.0代码
- package?service??
- {??
- ????import?flash.display.BitmapData;??
- import?flash.utils.ByteArray;??
- import?flash.utils.Endian;??
- ??????
- ?????
- ?
- ?????*/??
- public?class?BmpReader?{??
- ??????????
- ?????????
- ?????????*/??
- ????????public?function?BmpReader(){??
- ????????????super();??
- ????????}??
- ?????????*?读取24位的BitMap。<BR>?
- static?function?read(byteArray:ByteArray):BitmapData?{??
- try?{??
- ??????????????????
- ????????????????byteArray.endian?=?Endian.LITTLE_ENDIAN;??
- ??????????????????
- //?读取2字节,'BM'`对用十六进制为4D42,转化为十进制为19778??
- ????????????????if(byteArray.readUnsignedShort()?==?19778)?{??
- ??????????????????????
- ??????????????????????
- ????????????????????byteArray.position?=?10;??
- ????????????????????var?offset:int?=?byteArray.readInt();??
- //?跳到表示图片宽和高的字节??
- 18;??
- ????????????????????var?imageWidth:Number?=?byteArray.readInt();??
- ????????????????????var?imageHeight:Number?=?byteArray.readInt();??
- //?跳到表示图片位数的字节??
- 28;??
- ????????????????????var?biBitCount:int?=?byteArray.readUnsignedShort();??
- //?本类仅处理24位bmp??
- ????????????????????if(biBitCount?!=?24)?{??
- ????????????????????????trace("Image?Format?Error");??
- ????????????????????????return?null;??
- ????????????????????}??
- ????????????????????var?bitmapData:BitmapData?=?new?BitmapData(imageWidth,?imageHeight,?false,?0x00FFFFFF);??
- ????????????????????var?px:int?=?0;??
- ????????????????????var?py:int?=?imageHeight;??
- ????????????????????var?rColor: ????????????????????var?gColor: ????????????????????var?bColor://?补齐用字节数??
- ????????????????????var?junkbyte:int=?4?-?((imageWidth?*?3)?%?4);??
- while(py?>=?0)?{??
- ????????????????????????px?=?1;??
- while(px?<=?imageWidth)?{??
- ????????????????????????????if(byteArray.bytesAvailable?>?3)?{??
- ????????????????????????????????bColor?=?byteArray.readUnsignedByte();??
- ????????????????????????????????gColor?=?byteArray.readUnsignedByte();??
- ????????????????????????????????rColor?=?byteArray.readUnsignedByte();??
- ????????????????????????????????bitmapData.setPixel(px-1,?py-256*256*rColor+256*gColor+bColor);??
- ????????????????????????????}??
- ????????????????????????????px++;??
- ????????????????????????}??
- ??????????????????????????
- ????????????????????????junkByteCheck(byteArray,junkbyte);??
- ????????????????????????py--;??
- ????????????????}?else?{??
- ????????????????????trace("Image?Format?Error");??
- ????????????????}??
- ????????????}?catch?(err:Error){??
- ????????????????trace(err.getStackTrace());??
- ????????????}??
- ??????????????
- return?bitmapData;??
- ?????????*?跳过格式补齐用字节。<BR>?
- private?static?function?junkByteCheck(byteArray:ByteArray,?junkbyte:int):void?{??
- ????????????var?bavailable:int=byteArray.bytesAvailable;??
- if?((junkbyte>0?&&?junkbyte?<?4)?&&?(bavailable?>=?junkbyte)){??
- for?(var?i:int;?i<junkbyte;?i++){??
- ????????????????????byteArray.readUnsignedByte();??
- ????????????}else{??
- return??
- ??
- ????}??
- }??
?Flex mxml代码
<?xml?version="1.0"?encoding="utf-8"?>??
- <mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"??
- ????layout="absolute"?creationComplete="init()">??
- ????mx:Script ????????<![CDATA[?
- ????????????import?flash.net.URLLoader;?
- ????????????import?flash.net.URLLoaderDataFormat;?
- ????????????import?flash.net.URLRequest;?
- ????????????import?flash.events.*;?
- ?????????????
- ????????????import?service.BmpReader;?
- ????????????//?加载用?
- ????????????private?var?loader:URLLoader;?
- ????????????//?请求用?
- ????????????private?var?request:URLRequest;?
- ????????????/**?
- ?????????????*?初期化。<BR>?
- ?????????????*/??
- ????????????private?function?init():void?{?
- ????????????????loader?=?new?URLLoader();?
- ????????????????request?=?new?URLRequest("**.bmp");?
- ????????????????loader.dataFormat?=?URLLoaderDataFormat.BINARY;?
- ????????????????loader.addEventListener(Event.COMPLETE,?onCompleteHandler);?
- ????????????????loader.addEventListener(IOErrorEvent.IO_ERROR,onIOError);?
- ????????????????loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);?
- ????????????}?
- ?????????????*?加载图片。<BR>?
- ????????????private?function?load():void?{?
- ????????????????try{?
- ????????????????????loader.load(request);?
- ????????????????}?catch(error:Error)?{?
- ????????????????????trace("Request"?+?error);?
- ????????????????}?
- ?????????????*?加载完成后处理。<BR>?
- ?????????????*/?
- ????????????private?function?onCompleteHandler(e:Event):void?{?
- ????????????????trace("load?Complete");?
- ????????????????var?byteArray:ByteArray?=?ByteArray(e.currentTarget.data);?
- ????????????????var?bitMap:Bitmap?=?new?Bitmap(BmpReader.read(byteArray));?
- ????????????????bitMap.width?=?400;?
- ????????????????bitMap.height?=?300;?
- ????????????????image.source?=?bitMap;?
- ?????????????*?安全错误处理。<BR>?
- ????????????private?function?onSecurityError(securityError:?SecurityErrorEvent):void?{?
- ????????????????trace("securityError");?
- ?????????????*?IO错误处理。<BR>?
- ????????????private?function?onIOError(ioError:?IOErrorEvent):void?{?
- ????????????????trace("ioError");?
- ????????]]>??
- </ ??????
- mx:Image?id="image"?x="10"?y="10"?width="400"?height="300"/>??
- mx:Button?x="10"?y="332"?label="Show?BMP"?click="load()"mx:Application>??
?对bmp格式感兴趣的朋友,可参考:
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi