S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

AS3 bitmapdata与bytearray转换

Posted on 2010-06-30 17:49 S.l.e!ep.¢% 阅读(3527) 评论(0)  编辑 收藏 引用 所属分类: Flash
bitmapdata.getpixel 方法是ActionScript 3.0中的一个新方法,可以把矩形内的像素读取成bytearray,但是这种bytearray又不能直接用loader.loadbytes来读,一 读就会出现IOERROR。

为了达到可以直接用loader.loadbytes读取的目的,找了一下百度和GOOGLE,找到了以下方法,有需要的可以用用。

PS 以下代码转自互联网,牛C网只负责整理
/*
Copyright (c) 2007 Trevor McCauley - www.senocular.com
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS or IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS or COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES or OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT or OTHERWISE, ARISING
FROM, OUT OF or IN CONNECTION WITH THE SOFTWARE or THE USE or
OTHER DEALINGS IN THE SOFTWARE.
*/
package com.senocular.images {
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.utils.ByteArray;
import flash.utils.Endian;
public class BMPEncoder {
/**
* Converts a BitmapData instance into a 32-bit
* BMP image.
* @param bitmapData A BitmapData instance of the image
* desired to have converted into a Bitmap (BMP).
* @return A ByteArray containing the binary Bitmap (BMP)
* representation of the BitmapData instance passed.
*/
public static function encode(bitmapData:BitmapData):ByteArray {
// image/file properties
var bmpWidth:int = bitmapData.width;
var bmpHeight:int = bitmapData.height;
var imageBytes:ByteArray = bitmapData.getPixels(bitmapData.rect);
var imageSize:int = imageBytes.length;
var imageDataOffset:int = 0x36;
var fileSize:int = imageSize + imageDataOffset;
// binary BMP data
var bmpBytes:ByteArray = new ByteArray();
bmpBytes.endian = Endian.LITTLE_ENDIAN; // byte order
// header information
bmpBytes.length = fileSize;
bmpBytes.writeByte(0x42); // B
bmpBytes.writeByte(0x4D); // M (BMP identifier)
bmpBytes.writeInt(fileSize); // file size
bmpBytes.position = 0x0A; // offset to image data
bmpBytes.writeInt(imageDataOffset);
bmpBytes.writeInt(0x28); // header size
bmpBytes.position = 0x12; // width, height
bmpBytes.writeInt(bmpWidth);
bmpBytes.writeInt(bmpHeight);
bmpBytes.writeShort(1); // planes (1)
bmpBytes.writeShort(32); // color depth (32 bit)
bmpBytes.writeInt(0); // compression type
bmpBytes.writeInt(imageSize); // image data size
bmpBytes.position = imageDataOffset; // start of image data...
// write pixel bytes in upside-down order
// (as per BMP format)
var col:int = bmpWidth;
var row:int = bmpHeight;
var rowLength:int = col * 4; // 4 bytes per pixel (32 bit)
try {
// make sure we're starting at the
// beginning of the image data
imageBytes.position = 0;
// bottom row up
while (row--) {
// from end of file up to imageDataOffset
bmpBytes.position = imageDataOffset + row*rowLength;
// read through each column writing
// those bits to the image in normal
// left to rightorder
col = bmpWidth;
while (col--) {
bmpBytes.writeInt(imageBytes.readInt());
}
}
}catch(error:Error){
// end of file
}
// return BMP file
return bmpBytes;
}
}
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理