`
hanyi366
  • 浏览: 284585 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex 读取 bmp 格式的图片

    博客分类:
  • Flex
 
阅读更多

    现在要求把后台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>
 对bmp格式感兴趣的朋友,可参考:http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics