android bitmap.clone,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

posted on 2011-06-10 17:39 小果子 阅读(8000) 评论(0)  编辑 收藏 引用 所属分类: Flex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值