BitmapData 详解(一)(转)
在
ActionScript 3.0中,可以创建位图图像,还可以把外部的位图图像加载到Flash Player中。使用位图类,可以处理位图的像素和杂点。通过滤镜类,还可以增加位图的各种滤镜效果。
19.1
位图类
常用的有关位图的类有三个:
Bitmap类、BitmapData类和BitmapDataChannel类。Bitmap类用来显示位图图像,BitmapData类用来处理位图,BitmapDataChannel类是个枚举值,表示使用的通道。
19.1.1 Bitmap
类
Bitmap类表示位图图像的显示对象。可以使用
Bitmap类的构造函数创建图像,也可以使用Loader类加载外部图像。Bitmap类常用的属性如表19.1所示。
表19.1 Bitmap类常用的属性
属
性
|
说
明
|
bitmapData
|
被引用的
BitmapData
对象
|
pixelSnapping
|
控制
Bitmap
对象是否贴紧至最近的像素
|
smoothing
|
控制在缩放时是否对位图进行平滑处理
|
19.1.2 BitmapData
类
BitmapData类用来处理
Bitmap对象的数据。BitmapData类可以在程序运行时,任意调整位图的大小、透明度、像素等。BitmapData类常用的属性如表19.2所示,常用的方法如表19.3所示。
表19.2 BitmapData类常用的属性
属
性
|
说
明
|
height
|
位图图像的高度
|
rect
|
定义位图图像大小和位置的矩形
|
transparent
|
定义位图图像是否支持每个像素具有不同的透明度
|
width
|
位图图像的宽度
|
表19.3 BitmapData对象常用的方法
方
法
|
说
明
|
applyFilter
|
取得一个源图像和一个滤镜对象,并生成过滤的图像
|
clone
|
返回一个新的
BitmapData
对象,它是对原始实例的克隆,包含与原始实例所含位图完全相同的副本
|
colorTransform
|
使用
ColorTransform
对象调整位图图像的指定区域中的颜色值
|
compare
|
比较两个
BitmapData
对象
|
copyChannel
|
将数据从另一个
BitmapData
对象或当前
BitmapData
对象的一个通道传输到当前
BitmapData
对象的某个通道中
|
copyPixels
|
为没有拉伸、旋转或色彩效果的图像之间的像素处理提供一个快速例程
|
dispose
|
释放用来存储
BitmapData
对象的内存
|
draw
|
使用
Flash Player
矢量渲染器在位图图像上绘制
source
显示对象
|
fillRect
|
使用指定的
ARGB
颜色填充一个矩形像素区域
|
floodFill
|
对图像执行倾倒填充操作,从(
x, y
)坐标开始,填充一种特定的颜色
|
generateFilterRect
|
已知
BitmapData
对象、源矩形和滤镜对象,确定
applyFilter()
方法调用所影响的目标矩形
|
getColorBoundsRect
|
确定矩形区域是将位图图像中指定颜色的所有像素完全包括起来(如果将
findColor
参数设置为
true
),还是将不包括指定颜色的所有像素完全包括起来(如果将
findColor
参数设置为
false
)
|
getPixel
|
返回一个整数,它表示
BitmapData
对象中在特定点(
x, y
)
处的
RGB
像素值
|
getPixel32
|
返回一个
ARGB
颜色值,它包含
Alpha
通道数据和
RGB
数据
|
getPixels
|
从像素数据的矩形区域生成一个字节数组
|
hitTest
|
在一个位图图像与一个点、矩形或其他位图图像之间执行像素级的点击检测
|
lock
|
锁定图像,以使引用
BitmapData
对象的任何对象(如
Bitmap
对象)在此
BitmapData
对象更改时不会更新
|
merge
|
对每个通道执行从源图像向目标图像的混合
|
noise
|
使用表示随机杂点的像素填充图像
|
paletteMap
|
重新映射一个具有最多四组调色板数据(每个通道一组)的图像中的颜色通道值
|
perlinNoise
|
生成
Perlin
杂点图像
|
pixelDissolve
|
执行源图像到目标图像的像素溶解,或使用同一图像执行像素溶解
|
scroll
|
按某一(
x, y
)像素量滚动图像
|
setPixel
|
设置
BitmapData
对象的单个像素
|
setPixel32
|
设置
BitmapData
对象单个像素的颜色和
Alpha
透明度值
|
setPixels
|
将字节数组转换为像素数据的矩形区域
|
threshold
|
根据指定的阈值测试图像中的像素值,并将通过测试的像素设置为新的颜色值
|
unlock
|
解除锁定图像,以使引用
BitmapData
对象的任何对象(如
Bitmap
对象)在此
BitmapData
对象更改时更新
|
19.1.3
创建位图类
通常情况下,
Bitmap类和BitmapData类是结合在一起使用的。Bitmap类的构造函数的语法格式如下所示:
Bitmap(bitmapData:BitmapData = null, pixelSnapping:String = "auto", smoothing:Boolean = false)
其各个参数的说明如下。
— bitmapData:被引用的
BitmapData对象。
— pixelSnapping:默认值为
auto,表示Bitmap对象是否贴紧至最近的像素。
— smoothing:默认值为
false,表示在缩放时是否对位图进行平滑处理。
BitmapData类的构造函数的语法格式如下所示:
BitmapData(width:int, height:int, transparent:Boolean = true, fillColor:uint = 0xFFFFFFFF)
其各个参数的说明如下。
— width:位图图像的宽度,以像素为单位。
— height:位图图像的高度,以像素为单位。
— transparent:指定位图图像是否支持每个像素具有不同的透明度。
— fillColor:用于填充位图图像区域的
32位ARGB颜色值。
下面的示例使用两个位图类,创建一个矩形,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample(
)
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, true, 0x500066FF);
// 创建Bitmap类
var image:Bitmap = new Bitmap(bitmap);
// 设置显示位置
image.x = 90;
image.y = 50;
// 增加到舞台
addChild(image);
}
}
}
编译代码并运行,结果如图
19.1所示。
图19.1 创建位图类
19.1.4
加载外部图像
除了在内部创建位图之外,还可以加载外部的图像到位图中。加载外部的图像,需要用到
Loader对象。通过Loader对象的load()方法,可以加载外部的URL。下面的示例使用Loader对象,加载外部图像到位图中,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
private var loader:Loader = new Loader();
/********************
* 构造函数
* */
public function BitmapExample()
{
// 侦听数据加载
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
// 外部图像URL
loader.load(new URLRequest("Bitmap.jpg"));
}
/********************
* 加载外部图像到位图
* */
public function onComplete(event:Event):void
{
// 创建位图
var image:Bitmap = Bitmap(loader.content);
var bitmap:BitmapData = image.bitmapData;
addChild(image);
// 设置
image.x = 20;
image.y = 30;
}
}
}
编译代码并运行,结果如图
19.2所示。
图19.2 加载外部图像
19.2
像素的处理
在
BitmapData类中,包含了一组用于像素处理的方法。使用这些方法可以处理单个像素,还可以处理像素数组。
19.2.1
处理单个像素
处理单个像素用到的方法包括:
getPixel()、getPixel32()、setPixel()和setPixel32()。
1
.
getPixel()
方法
getPixel()方法表示在指定的点获取位图的
RGB像素。此方法有两个参数,分别是指定点的横坐标和纵坐标。其语法格式如下所示:
getPixel(x:int, y:int):uint
参数的详细说明如下。
— x:指定点的横坐标。
— y:指定点的纵坐标。
下面的示例使用
getPixel()方法获取点(1,1)的RGB像素值,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, false, 0xCC66FF);
// 设置像素
var i:uint = bitmap.getPixel(1, 1);
// 输出获取的像素
trace(i.toString(16));
}
}
}
编译代码并运行,输出的效果如图
19.3所示。
图19.3 使用getPixel()方法处理单个像素
2
.
getPixel32()
方法
getPixel32()方法与
getPixel()方法类似,区别是getPixel32()方法返回一个ARGB的像素值。其中返回值包含了透明度的值。其语法格式如下所示:
getPixel32(x:int, y:int):uint
参数的详细说明如下。
— x:指定点的横坐标。
— y:指定点的纵坐标。
下面的示例使用
getPixel32()方法,返回指定点的像素值,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, true, 0x50CC66FF);
// 设置像素
var i:uint = bitmap.getPixel32(1, 1);
// 输出获取的像素
trace(i.toString(16));
}
}
}
编译代码并运行,输出的结果如图
19.4所示。
图19.4 使用getPixel32()方法处理单个像素
3
.
setPixel()
方法
setPixel()方法用来设置
BitmapData对象的单个像素。此方法有三个参数,前两个参数表示要设置单个像素的点,第三个参数color表示生成的像素RGB颜色。其语法格式如下所示:
setPixel(x:int, y:int, color:uint):void
参数的详细说明如下所示:
— x:像素值会更改的像素的
x位置。
— y:像素值会更改的像素的
y位置。
— color:生成的像素的
RGB颜色。
下面的示例使用
setPixel()方法,循环设置某些点的像素的RGB颜色,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, false, 0x000066FF);
// 设置像素
for(var i:uint = 0; i < 300; i++)
{
bitmap.setPixel(20, i, 0xFFFFFF);
bitmap.setPixel(80, i, 0x000000);
bitmap.setPixel(160, i, 0x00CC00);
}
// 创建Bitmap类
var image:Bitmap = new Bitmap(bitmap);
// 设置显示位置
image.x = 90;
image.y = 50;
// 增加到舞台
addChild(image);
}
}
}
编译代码并运行,结果如图
19.5所示。
图19.5 setPixel()方法处理单个像素
4
.
setPixel32()
方法
setPixel32()方法与
setPixel()方法类似,不同的是,setPixel32()方法是设置ARGB(其中A表示透明度)的像素值。此方法的前两个参数与setPixel()方法相同,最后一个参数表示生成的像素的ARGB颜色。其语法格式如下所示:
setPixel32(x:int, y:int, color:uint):void
参数的详细说明如下所示:
— x:像素值会更改的像素的
x位置。
— y:像素值会更改的像素的
y位置。
— color:生成的像素的
ARGB颜色。
下面的示例使用
setPixel32()方法,循环设置某些点的像素值,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, true, 0x700066FF);
// 设置像素
for(var i:uint = 0; i < 300; i++)
{
bitmap.setPixel32(20, i, 0x20FF0000);
bitmap.setPixel32(21, i, 0x40FF0000);
bitmap.setPixel32(22, i, 0x60FF0000);
bitmap.setPixel32(23, i, 0x80FF0000);
bitmap.setPixel32(24, i, 0x00FF0000);
}
// 创建Bitmap类
var image:Bitmap = new Bitmap(bitmap);
// 设置显示位置
image.x = 90;
image.y = 50;
// 增加到舞台
addChild(image);
}
}
}
编译代码并运行,结果如图
19.6所示。
图19.6 使用setPixel32()方法处理单个像素
19.2.2
处理多个像素
ActionScript 3.0除了能处理单个像素外,还能处理多个像素。处理多个像素,一般是与字节数组有关的,把字节数组与像素的矩形区域相互转换。与处理多个元素有关的方法有两个:
getPixels()和setPixels()。
1
.
getPixels()
方法
getPixels()方法将像素的矩形区域转换为一个字节数组并返回。
getPixels()方法有一个参数,表示当前BitmapData对象中的一个矩形区域。其语法格式如下所示:
getPixels(rect:Rectangle):ByteArray
下面的示例使用
getPixels()方法获取矩形区域的像素值,代码如下所示:
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData类
var bitmap:BitmapData = new BitmapData(400, 300, true, 0x700066FF);
var bounds:Rectangle = new Rectangle(0, 0,bitmap.width, bitmap.height);
var pixels:ByteArray = bitmap.getPixels(bounds);
trace("像素数组的长度" + pixels.length);
trace("以下是取几个元素的值:");
trace(pixels[0]);
trace(pixels[4]);
trace(pixels[6]);
trace(pixels[10]);
}
}
}
编译代码并运行,输出的结果如图
19.7所示。
图19.7 使用getPixels()方法处理多个像素
2
.
setPixels()
方法
setPixels()方法将字节数组转换为像素的矩形区域。其语法格式如下所示:
setPixels(rect:Rectangle, inputByteArray:ByteArray):void
参数说明如下。
— rect:指定
BitmapData对象的矩形区域。
— inputByteArray:一个字节数组对象,由要在矩形区域中使用的
32位未经过相乘的像素值组成。
package
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
public class BitmapExample extends Sprite
{
/********************
* 构造函数
* */
public function BitmapExample()
{
// 创建BitmapData对象
var bmd1:BitmapData = new BitmapData(200, 200, true, 0xFFCCCCCC);
var bmd2:BitmapData = new BitmapData(200, 200, true, 0xFFFF0000);
// 创建获取像素的矩形区域
var rect:Rectangle = new Rectangle(20, 20, 150, 150);
var bytes:ByteArray = bmd1.getPixels(rect);
// 设置像素
bytes.position = 0;
bmd2.setPixels(rect, bytes);
// 创建Bitmap对象
var bm1:Bitmap = new Bitmap(bmd1);
addChild(bm1);
var bm2:Bitmap = new Bitmap(bmd2);
addChild(bm2);
// 设置位置
bm1.x = 50;
bm1.y = 100;
bm2.x = 260;
bm2.y = 100;
}
}
}
编译代码并运行,结果如图
19.8所示。
http://leo398.blog.51cto.com/658992/341950