Flash 8 中的图像 API 简介(转)

[b]在 ActionScript 中使用位图[/b]
新的 BitmapData ActionScript 类用来表示内存中的位图对象。创建新的类实例时, 空白图像存储在内存中。然后可以使用 BitmapData 类的各种方法处理此空白位图。但是, 在使用这个类之前, 您需要彻底了解位图。

位图是一种使用颜色值网格描述图像的数字图像格式。网格中的每个单元格代表一个像素。每个像素均由渲染器绘制, 并带有指定的颜色值, 以便形成一幅图像。Flash Player 中的位图以 32 位颜色深度存储。这意味着任何指定像素的颜色都存储为 32 位长度的二进制数。32 位图像中的像素颜色可以是所谓真彩色图像中的大约 1670 万种颜色的一种。 (因为肉眼可以观察到的颜色数目大致为 1670 万种颜色, 所以称之为真彩色。) 每种颜色由四种颜色通道 (即熟悉的红色、绿色、蓝色和 Alpha 通道) 组成, Alpha 通道用于向颜色添加可变的透明度级别。

[b]十六进制颜色值[/b]
在 ActionScript 中, 与 BitmapData 类结合使用的颜色值应使用 32 位十六进制数表示。32 位十六进制数是四对十六进制数字的序列。每个十六进制对定义四个颜色通道 (红、绿、蓝和 Alpha) 中每个颜色通道的强度。颜色通道的强度为以范围介于 0 到 255 之间的十进制数的十六进制表示法;FF 是指全强度 (255), 00 是指通道中无颜色 (0)。如您所见, 由于颜色值长度需要两位数字, 因此您需要填充一个通道, 例如用 01 代替 1。这样可确保十六进制数中始终具有八个数字。还应确保指定十六进制数前缀 0x。例如, 白色 (所有通道中都是全强度) 用十六进制记数法表示为: 0xFFFFFFFF。而黑色正好相反;它在红色、绿色和蓝色中的任何一个通道中都无颜色: 0xFF000000。请注意, Alpha 通道 (第一对) 仍然为全强度 (FF)。Alpha 通道中的全强度意味着没有 alpha (FF), 无强度 (00) 意味着全 alpha。因此, 透明像素颜色值为 0x00FFFFFF。

[size=large][b]从 ARGB 转换为十六进制值[/b][/size]
对于特定的颜色, 人们通常容易记住它的 Alpha、红色、绿色和蓝色 (ARGB) 值, 而记不住其十六进制值。如果您也有同样的情况, 那么您应当了解如何从 ARGB 转换为十六进制值。这可通过下面的 ActionScript 函数来实现:

function argbtohex(a:Number, r:Number, g:Number, b:Number)
{
return (a<<24 | r<<16 | g<<8 | b)
}

您可以按如下所示的方式使用该函数:

hex=argbtohex(255,0,255,0) //输出基于 10 进制数的 32 位红色十六进制值

从十六进制转换为 ARGB 值
要将十六进制颜色值转换回范围介于 0 到 255 之间的四个十进制数 (每个数代表 ARGB 中的一个通道) , 请使用下面的 ActionScript 函数:

function hextoargb(val:Number)
{
var col={}
col.alpha = (val › › 24) & 0xFF
col.red = (val › › 16) & 0xFF
col.green = (val › › 8) & 0xFF
col.blue = val & 0xFF
return col
}


您可以按如下所示的方式使用该函数:

argb=hextoargb(0xFFFFCC00);
alpha=argb.alpha;
red=argb.red;
green=argb.green;
blue=argb.blue;

使用 ActionScript 创建位图
要使用 ActionScript 在运行时创建位图, 请创建 BitmapData 类的一个实例:

myBitmap=new flash.display.BitmapData(width,height,transparent,fillColor)

BitmapData 类位于 flash.display 包中。为了每次创建新实例时不再需要输入该类的全限定路径, 首先请导入该包:

import flash.display.BitmapData

然后可以创建该类的一个实例:

myBitmap=new BitmapData(width,height,transparent,fillColor);

BitmapData 类构造函数接受以下四个参数: width、height、transparent 和 fillColor。width 和 height 参数用于指定位图的尺寸。如果将位图想象为网格, 则 width 为一行中的像素数, height 为行数。transparent 参数为布尔值 (true/false), 用于指定位图是否包含透明度。fillColor 参数用于指定位图中每个像素的默认 32 位颜色。但是, 如果将 transparent 参数设置为 false, 则会忽略指定颜色的前 8 位。在这种情况下, 不需要传递 32 位十六进制数。相反, 可以传递 24 位十六进制数, 例如 0xFFFFFF 是指白色像素。transparent 和 fillColor 参数是可选参数。如果省略它们, 则存储在内存中的位图将没有透明度, 并且每个像素将默认为白色 (0xFFFFFFFF)。

例如, 如果要创建黑色、完全不透明 (没有透明度) 的图像 (100 x 100 像素) , 应该使用下面的代码:

import flash.display.BitmapData
myBitmap = new BitmapData(100,100,false,0xFF000000)


备注: 在 Flash Player 中, 位图在任一方向 (宽度或高度) 上的最大尺寸都不得超过 2880 像素。如果尝试创建超过此限制的 BitmapData 实例, 则无法创建位图。该限制可防止用户在创建 Flash 影片时耗费大量的客户端 RAM。2880 x 2880 像素的位图将使用大约 32MB 的 RAM。

创建 BitmapData 类的实例后, 您可以使用许多方法来处理位图。例如, 可以应用滤镜效果、在特定区域中填充颜色、修改调色板以及使某些区域透明等等。可能性是无止境的。但是, 本文将涵盖所有的基础知识, 为您开始使用此工具打下良好的基础。

清理占用的内存
BitmapData 对象的实例可能会很快耗尽查看者的内存。位图中的每个像素使用 4 个字节的内存 (每个颜色通道 ARGB 占用 1 个字节) 进行存储。如果创建大小为 500 x 500 像素的位图, 将会占用接近 1MB 的 RAM。如果不再需要 BitmapData 对象, 则建议释放该位图使用的内存。BitmapData 类有可以实现此操作的方法, 即 dispose() 方法。可按如下方式使用该方法:

myBitmap.dispose()

请记住, 清理占用的内存可使 Flash 影片更加连贯。如果不再需要某个位图, 请释放内存。

显示图像
BitmapData 类的一个实例存储在内存中, 直到您决定让它出现时才能看到它, 那时您需要将该位图附加到舞台上以便进行渲染。可以使用新的 MovieClip.attachBitmap 方法在任何影片剪辑中显示 BitmapData 对象的实例:

import flash.display.BitmapData

myBitmap = new BitmapData(100,100,false,0xFFFFCC00);
this.createEmptyMovieClip("holder_mc",1)
holder_mc.attachBitmap(myBitmap,1);

最好先创建一个空白的影片剪辑, 它的唯一作用是显示位图, 因为在将位图附加到影片剪辑后就无法再将其删除。将位图放置到单独的影片剪辑中意味着您可以在以后通过删除该影片剪辑来删除该位图:

holder_mc.removeMovieClip()

将位图附加到影片剪辑后, 对该影片剪辑所做的任何更改将会自动更新;不需要在每次更改后重新附加位图。

快照
BitmapData 类的一个最出色的功能是可以为具有实例名的任何对象 (例如影片剪辑、视频对象和文本字段) 的可见状态拍摄快照, 并存为位图。此功能还可以创建流视频、网络摄像机或影片剪辑的定格。

要从影片剪辑或舞台上的其它实例创建位图, 请使用 BitmapData.draw() 方法。在默认情况下, 此方法将绘制对象当前可视状态的位图表示, 并且不对该位图对象进行转换。这意味着如果您为当前正在显示网络摄像机视频输入信号的视频对象拍摄快照, 而且该视频对象发生了旋转, 则所创建的位图表示将不会旋转。在下面的“转换快照”部分中将详细讨论此内容。

目前, 集中讨论 BitmapData.draw() 方法的强大功能。此方法最简单的形式是只使用矢量渲染器绘制指定对象的位图表示。使用此方法还可以向位图应用混合模式, 或使用 ColorTransform 类对位图的颜色值进行数学转换。例如, 假设舞台上有一个名为 animation_mc 的影片剪辑实例, 且该影片剪辑中存在一些矢量动画。在播放动画期间的任何时间点上, 您都可以使用如下方法对动画的当前可视状态拍摄快照, 并存为位图:

import flash.display.BitmapData

myBitmap = new BitmapData(animation_mc._width,animation_mc._height,true,0x00FFFFFF)
myBitmap.draw(animation_mc)

转换矩阵
Flash Player 8 中有一个新的 Matrix ActionScript 类, 它为您省去了创建转换矩阵的繁重工作。转换矩阵是数的 3 x 3 网格, 用于将一个坐标空间中的点映射到另一个坐标空间。使用一个转换矩阵, 可以同时倾斜、旋转、缩放以及移动位图或影片剪辑。本文中不详细讨论 Matrix 类。而是介绍一些您可能经常使用的 Matrix 类的方法, 特别是作为 BitmapData.draw() 方法的第二个参数的方法。

要创建转换矩阵, 请首先导入全限定的类路径, 这样就不需要重复键入该路径。可以在 flash.geom 包中找到 Matrix 类:

import flash.geom.Matrix

然后可以使用以下代码创建 Matrix 类的实例:

m = new Matrix()

这样会创建一个默认的恒等矩阵。将恒等矩阵应用于对象时, 不会更改对象的缩放、旋转、倾斜或位置。

创建恒等矩阵后, 可以使用 Matrix 类的各种方法修改对象的内部属性并向对象应用各种转换。

可以使用 Matrix.scale() 方法修改矩阵, 以便在将其应用于对象时, 它将缩放该对象。例如, 要创建将对象放大为两倍大小的转换矩阵, 请使用以下代码:

import flash.geom.Matrix
m = new Matrix()
m.scale(2,2)

如果要在应用转换矩阵时旋转对象, 则可以使用 Matrix.rotate() 方法。此方法可以将对象旋转任意所需的角度 (以弧度为单位)。使用下面的简单数学公式可以将角度从度转换为弧度:

radians=(degrees/180)*Math.PI

以下的代码用于修改转换矩阵;对某个对象应用该代码时, 会将对象旋转 45 度:

m.rotate((45/180) Math.PI) // 45 度 (以弧度为单位)

要在应用转换矩阵时移动某个对象, 可以使用 Matrix.translate() 方法修改矩阵, 以便在将转换矩阵应用到对象时, 会将该对象移动指定的偏移量:

m.translate(100,100) //将该对象在 x 和 y 轴方向上各移动 100 个像素

现在您已经有了一个转换矩阵, 将其应用到某个对象时, 可以将该对象放大至两倍大小、旋转 45 度并在 x 和 y 轴方向上各移动 100 个像素。

转换快照
我在前面曾经提到过 BitmapData.draw() 方法接受转换矩阵作为其第二个参数。这使您可以对舞台上的对象拍摄快照, 然后在绘制其位图表示时对其进行转换。

对影片剪辑拍摄快照时, 默认情况下在绘制时不会应用任何转换, 这意味着如果旋转舞台上的影片剪辑, 然后对其进行缩放并拍摄快照, 则所创建的位图表示将不会旋转或缩放。但是, 如果在拍摄快照时指定某个转换矩阵作为 draw() 方法的第二个参数, 则可以将这些转换应用于位图。

如果使用 ActionScript 或在内部创作环境中缩放、旋转或移动舞台上的影片剪辑, 则 Flash Player 使用转换矩阵显示已正确转换的影片剪辑。在 Flash Player 8 中可以使用 Movieclip.transform.matrix 属性访问此低级转换矩阵。此属性会返回 Matrix 类的一个实例, 并预先填充了正确的转换值。可以使用此属性确定已应用于影片剪辑的转换方法。使用以下代码还可以为一个影片剪辑制作与其它影片剪辑相同的转换:

Movieclip1.transform.matrix=movieclip2.transform.matrix

以下代码将使用 ActionScript 创建包含一个方形的影片剪辑并缩放和旋转该影片剪辑:

import flash.display.BitmapData

this.createEmptyMovieClip("square_mc",1)

//使用绘图 API 在影片剪辑内绘制一个黄色的方形
with(square_mc)
{
beginFill(0xFFCC00)
lineStyle(1,0x000000)
lineTo(0,100)
lineTo(100,100)
lineTo(100,0)
lineTo(0,0)
endFill()
}

//旋转该方形
square_mc._rotation=45

//将该方形放大到两倍大小
square_mc._xscale=square_mc._yscale=200

如果已对上面的影片剪辑拍摄快照, 则除非已指定了转换矩阵, 否则位图中的方形不会旋转或缩放。如果希望在绘制为位图对象时方形影片剪辑与在舞台上显示的完全相同, 则应该将该影片剪辑的转换矩阵指定为 draw() 方法的第二个参数:

//创建与该影片剪辑具有相同大小的透明位图
myBitmap =new BitmapData(square_mc._width,square_mc._height,true,0x00FFFFFF)

//按对象在舞台上的显示方式绘制位图对象
myBitmap.draw(square_mc,square_mc.transform.matrix)

如果不希望影片剪辑与它在舞台上的显示方式完全相同 (例如, 您可能希望影片剪辑的位图表示是它在舞台上所显示大小的一半) , 可以访问该影片剪辑的转换矩阵, 然后对其进行修改, 以便在将其应用于位图时, 应用以下必要的转换:

//创建透明位图, 它的大小是舞台上的影片剪辑大小的一半
myBitmap = new BitmapData(square_mc._width/2,square_mc._height/2,true,0x00FFFFFF)
//获取影片剪辑转换矩阵
m=square_mc.transform.matrix
/*

修改影片剪辑转换矩阵
以便在将其应用于位图时,
将按照原来大小的一半来绘制该对象

*/
m.scale(0.5,0.5)
//拍摄影片剪辑快照使其为原来大小的一半
myBitmap.draw(square_mc,m)

处理库中的图像
可以使用 BitmapData.loadBitmap() 方法直接从库中指定有链接标识符的图像创建位图对象。此方法是 BitmapData 类的静态方法, 这意味着无法从该类的实例访问该方法。而需要从类本身调用它, 并且它将返回一个预先填充的实例, 该实例有正确的尺寸并包含所有像素数据。

要为库中的图像指定链接标识符, 请执行以下步骤:

右键单击库中的图像, 然后选择“链接”。
选中“为 ActionScript 导出”复选框。
在“标识符”文本框中输入一个唯一的名称。
单击“确定”。
以下的 ActionScript 会为库中链接标识符为 logo 的图像创建位图。

import flash.display.BitmapData
logo = BitmapData.loadBitmap("logo")

该元件作为位图对象绘制, 并不应用任何转换。如果要调整从库中加载的元件的大小, 最好的方法是使用 Movieclip.attachMovie() 将该元件附加到临时影片剪辑中, 然后对该影片剪辑及其内容拍摄快照, 并应用缩小位图的转换矩阵:

import flash.geom.Matrix
import flash.display.BitmapData

//从库中附加影片剪辑 this.attachMovie("largeSymbol","temp_mc",this.getNextHighestDepth()

scale=50 //缩放百分比
scale/=100

//创建缩放位图的转换矩阵
scaleMatrix = new Matrix()
scaleMatrix.scale(scale,scale)

scaledBitmap = new BitmapData(temp_mc._width*scale,temp_mc._height*scale,true,0x00FFFFFF)
///绘制位图并使用指定转换矩阵对其进行缩放
scaledBitmap.draw(temp_mc,scaledMatrix)

//删除不再需要的电影剪辑
temp_mc.removeMovieClip()


如果要重新调整从库中加载的位图的大小, 则无法使用 Movieclip.attachMovie() 将其附加到影片剪辑中。需要寻找其它的解决方案, 其中涉及到两个位图对象的使用: 一个包含未缩放的位图, 另一个包含已缩放的位图:

import flash.geom.Matrix
import flash.display.BitmapData

//将库中的位图附加到位图对象
largeBitmap=BitmapData.load("largeBitmap")

scale=50 //缩放百分比

//规范缩放
scale/=100


//创建新转换矩阵
scaleMatrix = new Matrix()
//缩放矩阵
scaleMatrix.scale(scale,scale)

/*

如果附加的位图是透明的, 则使用透明像素填充该位图
否则, 使用白色像素填充该位图

*/
fillColor=(largeBitmap.transparent) ?0x00FFFFFF:0xFFFFFFFF

//
scaledBitmap = new BitmapData(largeBitmap.width*scale,largeBitmap.height*scale,largeBitmap.transparent,fillColor)
scaledBitmap.draw(largeBitmap,scaledMatrix)

//释放不再使用的大位图占用的内存
largeBitmap.dispose()


处理加载的图像
您无法直接将外部文件 (JPEG、GIF、PNG 或 Flash 影片) 加载到 BitmapData 类的实例。而必须将外部文件加载到影片剪辑, 等到加载完成后, 才可以对包含外部文件的影片剪辑拍摄快照:

import flash.display.BitmapData

//创建一个影片剪辑以放置外部文件
this.createEmptyMovieClip("holder_mc",this.getNextHighestDepth());

/*

使用 MovieClipLoader 类可以在
外部文件加载或加载失败时得到通知

*/

loader = new MovieClipLoader()

//通过触发事件指示状态更新
loader.addListener(this)

//将外部文件加载到承载影片剪辑中
loader.loadClip("logo.png",holder_mc)


//在加载完成并准备使用该文件时“加载器”对象将调用此函数
function onLoadInit()
{

/*
在内存中创建与所加载文件大小相同的新位图对象
并填充透明像素
*/

myBitmap = new BitmapData(holder_mc._width, holder_mc._height,true,0x00FFFFFF)

//对包含所加载外部文件的影片剪辑拍摄快照
myBitmap.draw(holder_mc)

//我们不再需要此影片剪辑, 因此将其删除
holder_mc.removeMovieClip()
}

//如果无法加载该文件, 则“加载器”对象将调用此函数
function onLoadError()
{
/*

无法加载该外部文件, 因此
不再需要承载影片剪辑

*/

holder_mc.removeMovieClip()
}

应用滤镜
本文中不详细讨论滤镜。但是, 在图像处理过程中通常需要对位图进行模糊处理, 这样可以减少杂点并锐化边缘, 因此我认为有必要包含一些有关如何对位图应用滤镜的信息。可以使用 BitmapData.applyFilter() 方法直接对位图应用不同的滤镜效果。Flash Player 支持各种滤镜效果, 例如置换、模糊、发光、投影以及斜角。可以将所有这些滤镜应用于位图的一个矩形区域或整个位图。以下代码使用模糊滤镜对从库中加载的位图应用模糊效果:

import flash.filters.BlurFilter
import flash.display.BitmapData

//从库中加载位图
myBitmap = BitmapData.loadBitmap("landscape")

//创建模糊滤镜
blur=new BlurFilter(5,5,2)

//将模糊滤镜应用于所加载的位图
myBitmap.applyFilter(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,blur)

可以使用 applyFilter() 方法的第二个参数指定要应用滤镜的矩形区域。在上面的示例中, 我使用的是位图的矩形属性, 它将返回与图像尺寸大小一致的 flash.geom.Rectangle 类的一个实例, 因此可以将滤镜应用到整个位图。但是, 如果只希望将滤镜应用于位图的特定区域, 则可以创建 Rectangle 类的一个实例然后将其作为第二个参数传递给 applyFilter() 方法, 从而更改该矩形区域:

import flash.filters.BlurFilter
import flash.display.BitmapData
import flash.geom.Rectangle

//从库中加载位图
myBitmap = BitmapData.loadBitmap("landscape")

//创建模糊滤镜
blur=new BlurFilter(5,5,2)

//定义要应用滤镜的矩形区域
region=new Rectangle(0,0,50,50)

//将模糊滤镜应用于所加载的位图
myBitmap.applyFilter(myBitmap,region,myBitmap.rectangle.topLeft,blur)

需要注意, 有时将滤镜应用于整个位图时, 所生成的位图比源位图大。例如, 投影滤镜将在位图的边缘添加像素。这样会使生成的位图比应用滤镜的原始位图大。请想象一下, 对宽度和高度为 100 像素的位图应用角度为 45 度、长度为 20 像素的投影滤镜效果。应用滤镜后, 生成的图像将比原始图像的宽度和高度多 16 像素。但是, 直到创建 BitmapData 对象并定义其尺寸后, 您才会知道这个数字。创建 BitmapData 对象后, 您无法更改它的尺寸。

所幸的是您可以在应用滤镜之前, 事先确定该滤镜操作的结果图像的实际大小, 这样您可以相应调整目标位图的大小:

import flash.filters.DropShadowFilter
import flash.display.BitmapData

//从库中加载位图
myBitmap = BitmapData.loadBitmap("logo")

//创建默认的投影滤镜
dropShadow = new DropShadowFilter()

//确定应用滤镜后位图的大小
filteredSize=myBitmap.generateFilterRect(myBitmap.rectangle,dropShadow)

//如果左上角的值为负, 则需要增加宽度和高度
w=(filteredSize.x<0) ? filteredSize.width-filteredSize.x:filteredSize.width
h=(filteredSize.y<0) ? filteredSize.height-filteredSize.y:filteredSize.height

//如果加载的位图是透明的, 则填充透明像素, 否则填充白色像素
fillColor=(myBitmap.transparent) ?0x00FFFFFF:0xFFFFFFFF

//创建一个新位图, 用于存储经过过滤的结果
filteredBitmap = new BitmapData(w,h,myBitmap.transparent,fillColor)

//将滤镜应用于加载的位图
filteredBitmap.applyFilter(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,dropShadow)

获得像素的颜色
可以确定位图中任何指定像素的颜色值。BitmapData.getPixel() 方法可以返回位于指定 X/Y 坐标处像素的基于 10 进制数的 RGB 颜色:

import flash.display.BitmapData
myBitmap = new BitmapData(100,100,false,0xFFCC00)
pixelColor=myBitmap.getPixel(50,50)


要获得所返回的颜色值 (基于 10 进制) 的十六进制表示, 必须使用 toString() 方法并将可选的 radix 参数设置为 16, 以便将该数转换为基于 16 进制的字符串:

trace("0x"+pixelColor.toString(16)) //输出: 0xffcc00

但是, 请注意, 如果对包含 Alpha 通道数据 (BitmapData.transparent == true) 的位图使用 getPixel() 方法, 则返回值将会预乘 Alpha 通道。这意味着像素的颜色将乘以该像素的 Alpha 通道强度, 这样会得到无法预料的结果。

BitmapData.getPixel32() 方法可以返回位于指定 X/Y 坐标处像素的基于 10 进制数的 ARGB 颜色。与 getPixel() 不同, 此方法还将返回像素的 Alpha 通道数据:

import flash.display.BitmapData
myBitmap = new BitmapData(100,100,true,0x11FFCC00)
pixelColor=myBitmap.getPixel32(50,50)
trace("0x"+pixelColor.toString(16)) //输出: 0x11ffd200

设置像素的颜色
要设置像素的颜色, 可以使用 BitmapData.setPixel() 方法。此方法会将位于指定 X/Y 坐标处的像素的颜色更改为指定的颜色。指定的颜色应为一个已忽略 Apha 通道位的 24 位十六进制数, 例如 0xFFCC00 (黄色):

myBitmap = BitmapData.load("photo")
//移动 100 像素
for(i=0;i<100;++i)
{
//生成两个随机的 X/Y 坐标
rx1=Math.floor(Math.random()*myBitmap.width)
rx2=Math.floor(Math.random()*myBitmap.width)
ry1=Math.floor(Math.random()*myBitmap.height)
ry2=Math.floor(Math.random()*myBitmap.height)
//将一个随机的像素颜色设置为另一个随机像素的颜色
myBitmap.setPixel(rx1,ry1,myBitmap.getPixel(rx2,ry2))
}


只有在位图不包含 alpha 透明度的情况下, 才使用 BitmapData.transparent 方法, 否则应使用 BitmapData.setPixel32() 方法。可使用 setPixel32() 方法指定包含 Alpha 通道数据的 32 位十六进制数:

myBitmap.setPixel32(50,50,0xFFFFCC00) //将 (x:50, y:50) 处的像素设置为不透明的黄色

设置像素组的颜色
可以使用 fillRect() 方法用指定颜色填充矩形像素组。这种方法通常在将位图的状态重新设置为其初始状态时非常有用, 这是因为可以用一种颜色填充整个位图, 从而有效地擦除位图的内容。

此方法的第一个参数是要填充的矩形区域。它应为 flash.geom.Rectangle 类的一个实例。第二个参数是矩形区域中像素更改后的颜色。

要指定矩形区域, 首先将全限定路径导入到 Rectangle 类中;在 flash.geom 包中可以找到 Rectangle 类:

Import flash.geom.Rectangle

然后, 使用此代码创建它的实例:
myRect=new Rectangle(0,0,100,100)

前两个参数是该矩形左上角的 X/Y 坐标。后两个参数指定该矩形的尺寸 (宽度和高度)。

然后可以用指定颜色填充该区域:

myBitmap.fillRect(myRect,0xFFFF0000) //将指定区域中的所有像素指定为红色

请注意, BitmapData 类的每个实例都有一个属性可返回位图对象的大小和位置。位图对象会始终定位于 (0,0) 处, 因此只需找出以 BitmapData 类中可用的大多数方法所需格式表示的尺寸。该属性名为 BitmapData.rectangle, 它返回 Rectangle 类的一个实例。

//用绿色像素填充整个位图
myBitmap.fillRect(myBitmap.rectangle,0xFF00FF00);

更改颜色的范围
逐个查找图像中的每个像素并将其更改为其它颜色是一项非常艰巨的任务。但是, 如果您需要更改在某一颜色范围内所有像素的颜色或更改具有特定颜色的所有像素的颜色, 则不需逐个更改每个像素。使用 BitmapData.threshold() 方法, 可以隔离并替换特定颜色范围内像素的颜色, 并对像素执行其它逻辑运算。例如, 要将图像中的所有红色像素设置为透明, 可以使用以下代码:

import flash.display.BitmapData
import flash.geom.Rectangle

//创建一个新的 100 x 100 像素位图, 并用红色像素填充该区域
myBitmap = new BitmapData(100,100,true,0xFFFF0000)

//在位图的中心处定义一个 20 x 20 像素见方的矩形区域
centeredRectangle=new Rectangle(40,40,20,20)

//用黑色像素填充位图中心的矩形区域
myBitmap.fillRect(centeredRectangle,0xFF000000)

//将位图中所有为红色像素更改为透明
redPixelCount=myBitmap.threshold(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,"==",0xFFFF0000,0x00FFFFFF)

BitmapData.threshold() 方法将返回受该操作影响的像素数:

trace(redPixelCount)

通过传递以下字符串之一用于运算参数 (这是第四个参数) , 可以更改 threshold 方法的运算:


==
!=
<
<=
› =


此方法使您可以执行许多任务, 象将 != 用于运算参数来更改图像中所有非指定颜色的像素等, 例如:

myBitmap.threshold(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,"!=",0xFFFF0000,0x00FFFFFF)


复制像素
复制像素是图像处理时常用的任务。可以使用 BitmapData.copyPixels() 方法将一个位图中的像素复制到另一个位图。此方法将源位图指定区域中的矩形区域复制到目标位图中的指定位置。这使您可以创建如锯齿之类的效果。还可以使用更高级的功能, 将含有 Alpha 通道数据的第二个图像用作复制蒙版。这样, 可以复制位图中非矩形的区域。

下面的示例将一个位图中的矩形区域像素复制到另一个位图:

import flash.display.BitmapData
import flash.geom.Rectangle

//从库中附加位图
myBitmap = BitmapData.loadBitmap("logo")

//定义要从源位图中复制的区域
area=new Rectangle(10,10,50,50)

//创建新位图以放置复制的像素
bitmapSlot=new BitmapData(50,50)

//将所加载位图的指定区域中的像素复制到左上角
bitmapSlot.copyPixels(myBitmap,area,bitmapSlot.rectangle.topLeft)

下面的示例将一个位图中的圆形区域像素复制到另一个位图, 并使用包含一个圆形而且圆形周围是透明像素的位图作为 Alpha 蒙版:

import flash.display.BitmapData
import flash.geom.Rectangle
import flash.geom.Matrix

//从库中附加位图
myBitmap = BitmapData.loadBitmap('logo')

//在影片剪辑中绘制一个圆形
this.createEmptyMovieClip('mask_mc',1)
mask_mc.lineStyle(75,0x00FF00)
//这将创建一个直径为 75 像素的圆形
mask_mc.lineTo(0,1)
//创建一个位图以放置 Alpha 蒙版
maskBitmap = new BitmapData(100,100,true,0x00FFFFFF)
//创建转换矩阵
m=new Matrix()
//在将影片剪辑绘制到位图中时置换影片剪辑的位置
m.translate(50,50)
//在位图中绘制圆形
maskBitmap.draw(mask_mc,m)
//删除不再需要的包含圆形的影片剪辑
mask_mc.removeMovieClip()
//创建位图以放置从库中加载的位图复制的像素
//使用透明像素填充它
circleBitmap=new BitmapData(100,100,true,0x00FFFFFF)
//使用包含圆形的位图作为 Alpha 蒙版, 从库中加载的位图中复制像素
circleBitmap.copyPixels(myBitmap,myBitmap.rectangle,circleBitmap.rectangle.topLeft,maskBitmap,maskBitmap.rectangle.topLeft)
//显示位图
this.attachBitmap(circleBitmap,1)
//删除不再需要的蒙版位图
maskBitmap.dispose()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值