现在要求把后台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;
- /**
- * 读取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
- }
- }
- }
- }
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: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>
引自:http://hanyi366.iteye.com/blog/1580748#comments