现在要求把后台bmp格式的图片,在flash中显示。如大家所知的,Flash已经内置了对jgp,png,gif图片的支持。不知道Adobe怎么想的,为啥不支持bmp呢。唉,bmp真是个苦命的孩子啊。
不过还好有解决方案:以二进制的形式,把图片从后台加载到前台,然后通过bmp本身的格式进行解析,解析成为Flash认识的格式(BitMapData),然后就可以使用了哈,废话不多说了,看实例(加载24位bmp):
package service { import flash.display.BitmapData; import flash.utils.ByteArray; import flash.utils.Endian; /** * 读取24位的BitMap用类。<BR> */ public class BmpReader { /** * 构造函数。<BR> */ public function BmpReader(){ super(); } /** * 读取24位的BitMap。<BR> */ public 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(); // 跳到表示图片宽和高的字节 byteArray.position = 18; var imageWidth:Number = byteArray.readInt(); var imageHeight:Number = byteArray.readInt(); // 跳到表示图片位数的字节 byteArray.position = 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:int = 0; var gColor:int = 0; var bColor:int = 0; // 补齐用字节数 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-1, 256*256*rColor+256*gColor+bColor); } px++; } // 跳过格式补齐用字节 junkByteCheck(byteArray,junkbyte); py--; } } else { trace("Image Format Error"); return null; } } 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 } } } }
<?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:Script> <!-- GUI --> <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>
注意:设置自己的图片URL。
参考:http://cookbooks.adobe.com/index.cfm?event=showdetails&postId=10264
另外,对bmp格式感兴趣的朋友,可参考:http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
ps:bmp格式是日文网站的链接,找中文没看到那么详细的。