- 浏览: 101989 次
- 性别:
- 来自: 大连
文章分类
最新评论
AS3位图操作
创建位图
矢量图和位图的区别:矢量图形是由数学方法描述图形元素,比如一条直线是从(x0,y0)到(x1,y1)。而位图把图形描述为一个矩形区域值集合,每个点都对应一个颜色值
矢量图有两大优势:缩放和文件大小。当你缩放矢量图时,图像总能保持清晰,而位图当放大时就会出现锯齿状变得不清晰。
正因为矢量图是一个线条,曲线和图形的坐标组成的列表,所以它的文件和位图相比小很多。而位图要记录每个点的颜色值,信息量非常大,也就导致了文件的庞大。
矢量图的这种优势使它作为Flash媒体格式的最好形式,但是位图也有它自己的优点,比如位图能很好的表现照片,如果用矢量图去描述照片的所有颜色和图形,那结果就是比位图的文件还要大了。
位图另一个好处就是很容易进行处理,矢量图的每个曲线都是经过计算出来的,如果图像复杂就会花很长时间去处理,而位图就容易处理多了,无论多么复杂的动画,位图总能表现的很好。
32位16进制颜色值的得到方法:假如有0x0A5500EE,则表示alpha的值是0A,R(red)是55,G(green)是00,B(blue)是EE。关于alpha的值,其范围用十进制表示是在0--255之间,用十六进制表示就是00--FF。可以用int.toString(16)来进行十进制到十六进制的转换,如果转换的值为个位,则需要补0,例如1表示为01,e表示为0E
创建位图的一般步骤:
1. 构建一个BitmapData对象:var bitmap:BitmapData = new BitmapData(width,height,transparent,fillColor);
width -- 位图的宽度
height -- 位图的高度
transparent -- 是否创建alpha通道,默认为true
fillColor -- 32位16进制的颜色值,在transparent为true时,默认为0xFFFFFFFF
2. 新建Bitmap对象,以之前新建的BitmapData为参数:var image:Bitmap = new Bitmap(bitmap);
3. 直接添加该Bitmap对象:this.addChild(image);
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var alphaInt:int = 128;
var alphaHex:String = alphaInt.toString(16);
if(alphaHex.length==1)
{
alphaHex = "0" alphaHex;
}
var fillColor:String = "0x" alphaHex "FFFF00";
var bitmap:BitmapData = new BitmapData(200,100,true,uint(fillColor));
var image:Bitmap = new Bitmap(bitmap);
this.addChild(image);
}
}
}
绘制可视化对象到位图上
先在MovieClip或Sprite上画好,然后把对象画到位图上
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var rect:Sprite = new Sprite();
rect.graphics.beginFill(0x00FF00);
rect.graphics.drawRect(30,30,50,50);
rect.graphics.endFill();
var bitmap:BitmapData = new BitmapData(200,100,true,0x80000000);
bitmap.draw(rect);
var image:Bitmap = new Bitmap(bitmap);
image.x = 100;
image.y = 100;
this.addChild(image);
}
}
}
载入外部图片到位图上
使用flash.display.Loader类载入图片,当图片载入完成时,loader的content属性就是一个Bitmap.访问Bitmap的bitmapData属性就在访问载入的图片
package {
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class Sample0310 extends Sprite
{
private var loader:Loader;
public function Sample0310()
{
loader = new Loader();
loader.load(new URLRequest("http://www.yysoft.com/Upload/8/images/ccns_03.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
}
private function onLoadComplete(target:Event):void
{
var circle:Shape = new Shape();
circle.graphics.beginFill(0xFFFF00);
circle.graphics.drawCircle(50,50,25);
circle.graphics.endFill();
var image:Bitmap = loader.content as Bitmap;
image.bitmapData.draw(circle);
this.addChild(image);
}
}
}
得到或设置位图上的像素
使用BitmapData类的getPixel(),setPixel,getPixel32()和setPixel32方法。例如:getPixel(mouseX,mouseY),setPixel(x,y,0xFF00FF00),getPixel()和setPixel()方法是专门为不透明的BitmapData类实例所用,而getPixel32()和setPixel32()则支持alpha通道的位图。可以通过BitmapData 构造器指定是否为透明位图
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Sample0310 extends Sprite
{
private var image:Bitmap;
private var txt:TextField;
public function Sample0310()
{
txt = new TextField();
txt.y = 130;
image = new Bitmap();
image.bitmapData = new BitmapData(100,100,true,0xFFFFFFFF);
image.bitmapData.noise(1000,0,255,1|2|4,false);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
this.addChild(txt);
this.addChild(image);
}
private function onEnterFrame(target:Event):void
{
txt.text = "#" image.bitmapData.getPixel(mouseX,mouseY).toString(16);
}
}
}
创建矩形填充
使用BitmapData类的fillRect()方法
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.geom.Rectangle;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(200,100,true,0x80000000);
image.bitmapData.fillRect(new Rectangle(20,20,50,50),0x80FFFF00);
this.addChild(image);
}
}
}
创建充溢填充
所谓充溢填充,就是指完全填充一个不规则的区域。使用BitmapData类的floodFill()方法,调用形式为:floodFill(x,y,color),其中x,y为要填充的坐标点,color为坐标颜色。需要特别这样的是,填充的始终是该坐标点最上层的容器元素
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
public class Sample0310 extends Sprite
{
private var image:Bitmap;
public function Sample0310()
{
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xFFFFFF);
for(var i:uint=0;i<10;i )
{
image.bitmapData.fillRect(new Rectangle(Math.random()*(stage.stageWidth-50),
Math.random()*(stage.stageHeight-50),
30,30),Math.random( ) * 0xffffffff);
}
this.addChild(image);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
}
private function onMouseDown(target:MouseEvent):void
{
image.bitmapData.floodFill(mouseX,mouseY,0x000000);
}
}
}
拷贝位图里的部分像素
利用destBitmapData.copyPixels(sourceBitmapData,sourceRect,destPoint)来将源位图上某个区域的像素,拷贝到目标区域的某个坐标点。
destBitmapData -- 目标位图
sourceBitmapData -- 源位图
sourceRect -- 源位图的矩形区域
destPoint -- 目标位图的拷贝坐标点
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
public class Sample0310 extends Sprite
{
private var loader:Loader;
private var imageContainer:Bitmap;
public function Sample0310()
{
imageContainer = new Bitmap();
imageContainer.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xFFFFFF);
this.addChild(imageContainer);
loader = new Loader();
loader.load(new URLRequest("http://www.yysoft.com/Upload/8/images/ccns_03.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
}
private function onLoadComplete(target:Event):void
{
var image:Bitmap = loader.content as Bitmap;
this.addChild(image);
imageContainer.bitmapData.copyPixels(image.bitmapData,new Rectangle(20,20,50,100),new Point(300,200));
}
}
}
创建噪波图案
使用BitmapData类的noise(seed,low,high,channel,grayscale)
seed -- 随机种子(注意,同一个seed生成的图片是一样的)
low -- 每个像素的最小值,范围在0到255(设置越高图案越亮)
high -- 每个像素的最大值,范围在0到255(设置越高图案越亮)
channel -- 指定把噪波应用到哪个通道上,其值可以是1,2,4,8;或者用BitmapDataChannel类的RED,GREEN,BLUE和ALPHA grayscale -- 一个布尔值,true表示随机值应用到三个通道上(当三个通道的值为相同时,即为灰色)。默认为false
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Sprite;
public class Sample0313 extends Sprite
{
public function Sample0313()
{
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff);
image.bitmapData.noise(1000,128,255,BitmapDataChannel.BLUE,true);
this.addChild(image);
}
}
}
使用阈值
使用BitmapData类的threshold()方法
public function threshold(
sourceBitmapData:BitmapData, //源位图
sourceRect:Rectangle, //源位图要进行比较的区域,全部为sourceBitmapData.rect
destPoint:Point, //从左上角开始把原始位图覆盖到目标位图上,从(0,0)为new Point()
operation:String, //操作符,“<”、“<=”、“>”、“>=”、“==”、“!=”
threshold:uint, //阈值
color:uint = 0, //阈值测试成功时对像素设置的颜色值。默认值为0x00000000
mask:uint = 0xFFFFFFFF, //掩码,分4个通道进行比较,如只比较红色通道:0x00FF0000
copySource:Boolean = false //是否拷贝源位图,为false则只拷贝阈值测试成功的像素。为true则拷贝整个源位图比较区域
):uint
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.geom.Point;
public class Sample0318 extends Sprite
{
public function Sample0318()
{
var rect:Shape = new Shape();
rect.graphics.beginFill(0xFF0000);
rect.graphics.drawRect(15,15,45,45);
rect.graphics.beginFill(0x00FF00);
rect.graphics.drawRect(75,75,45,45);
rect.graphics.beginFill(0x0000FF);
rect.graphics.drawRect(135,135,45,45);
rect.graphics.endFill();
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(200,200,false,0x000000);
image.x = 20;
image.y = 20;
image.bitmapData.draw(rect);
this.addChild(image);
var destImage:Bitmap = new Bitmap();
destImage.bitmapData = new BitmapData(200,200,false,0xFFFFFF);
destImage.x = image.x image.width 15;
destImage.y = image.y;
destImage.bitmapData.threshold(
image.bitmapData,
image.bitmapData.rect,
new Point(),
">",
0x0000FF00,
0XFFFFFF00,
0X00FFFFFF,
true);
this.addChild(destImage);
}
}
}
在位图上应用滤镜
使用BitmapData类的applyFilter()
destBmp.applyFilter(sourceBitmapData, sourceRect, destPoint, filter);
sourceBitmapData -- 要使用的输入位图图像。源图像可以是另一个BitmapData对象,也可以引用当前BitmapData实例
sourceRect -- 定义要用作输入的源图像区域的矩形
destPoint -- 目标图像(当前BitmapData实例)中与源矩形的左上角对应的点
filter -- 用于执行过滤操作的滤镜对象
如果 BitmapData 对象和指定为 sourceBitmapData 参数的对象是同一对象,应用程序将使用该对象的临时副本来执行滤镜。为了获得最佳性能,请避免这种情况
可以直接定义Bitmap.filters属性,它不会直接接触BitmapData的像素数据,因为滤镜只应用在包装BitmapData的Bitmap上
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.Point;
public class Sample0319 extends Sprite
{
private var image:Bitmap;
private var blurFilter:BlurFilter;
private var point:Point;
public function Sample0319()
{
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
this.addChild(image);
blurFilter = new BlurFilter();
point = new Point();
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(target:Event):void
{
for(var i:uint=0;i<100;i )
{
image.bitmapData.setPixel(mouseX Math.random()*20 - 10,
mouseY Math.random()*20 - 10,
0xFFFFFF);
}
image.bitmapData.applyFilter(image.bitmapData,image.bitmapData.rect,point,blurFilter);
}
}
}
位图的淡出
使用BitmapData类的pixelDissolve()方法
seed = pixelDissolve(
sourceBitmapData:BitmapData, //要使用的源位图图像。源图像可以是另一个BitmapData对象,也可以是目标位图自身
sourceRect:Rectangle, //源位图区域的矩形(一般等于目标位图的大小)
destPoint:Point, //目标位图(当前BitmapData实例)中与源矩形的左上角对应的点
randomSeed:int = 0, //用于开始像素溶解的随机种子(第一次可随意定义)
numPixels:int = 0, //每次拷贝多少像素,默认值是源区域(宽度×高度)的1/30
fillColor:uint = 0 //一个ARGB颜色值,用于填充其原值等于目标值的像素(即目标位图淡出为该种颜色) ):int
* 该函数每次调用,都返回用于后续调用的新随机种子值
* 可以通过 已拷贝的像素总数 是否大于 位图宽度×位图高度,来判断是否拷贝完成
package {
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.net.URLRequest;
public class Sample0319 extends Sprite
{
private var imageSmall:Bitmap;
private var imageBig:Bitmap;
private var seed:uint;
private var pixelComplete:uint = 0;
public function Sample0319()
{
var loader:Loader = new Loader();
loader.load(new URLRequest("1.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadSmallComplete);
loader = new Loader();
loader.load(new URLRequest("2.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadBigComplete);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onLoadSmallComplete(event:Event):void
{
var tmp:LoaderInfo = event.target as LoaderInfo;
imageSmall = tmp.loader.content as Bitmap;
this.addChild(imageSmall);
}
private function onLoadBigComplete(event:Event):void
{
var tmp:LoaderInfo = event.target as LoaderInfo;
imageBig = tmp.loader.content as Bitmap;
//this.addChild(imageBig);
//imageBig.x = 200;
}
private function onEnterFrame(event:Event):void
{
if(imageSmall!=null && imageBig!=null)
{
//每次拷贝总像素的1%,如果是30帧播放的话,即1秒完成30%,全部完成要3秒左右
var numPixels:uint = imageSmall.bitmapData.width * imageSmall.bitmapData.height / 100;
seed = imageSmall.bitmapData.pixelDissolve(
imageBig.bitmapData,
imageSmall.bitmapData.rect,
new Point(),
seed,
numPixels);
pixelComplete = numPixels;
if(pixelComplete > imageSmall.bitmapData.width * imageSmall.bitmapData.height)
{
this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
}
}
}
}
滚动位图
使用BitmapData类的scroll(x,y)方法,将图像按一定量的(x,y)像素进行滚动。滚动区域之外的边缘区域保持不变
x -- 水平滚动量
y -- 垂直滚动量
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.LoaderInfo;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
public class Sample0320 extends Sprite
{
private var image:Bitmap;
public function Sample0320()
{
var circle:Shape = new Shape();
circle.graphics.beginFill(0xFFFF00);
for(var i:int=20;i<200;i=i 20)
{
circle.graphics.drawCircle(i,i,10);
}
circle.graphics.endFill();
//this.addChild(circle);
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
image.bitmapData.draw(circle);
this.addChild(image);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
if(image!=null)
{
image.bitmapData.scroll(-1,-1);
}
}
}
}
矢量图和位图的区别:矢量图形是由数学方法描述图形元素,比如一条直线是从(x0,y0)到(x1,y1)。而位图把图形描述为一个矩形区域值集合,每个点都对应一个颜色值
矢量图有两大优势:缩放和文件大小。当你缩放矢量图时,图像总能保持清晰,而位图当放大时就会出现锯齿状变得不清晰。
正因为矢量图是一个线条,曲线和图形的坐标组成的列表,所以它的文件和位图相比小很多。而位图要记录每个点的颜色值,信息量非常大,也就导致了文件的庞大。
矢量图的这种优势使它作为Flash媒体格式的最好形式,但是位图也有它自己的优点,比如位图能很好的表现照片,如果用矢量图去描述照片的所有颜色和图形,那结果就是比位图的文件还要大了。
位图另一个好处就是很容易进行处理,矢量图的每个曲线都是经过计算出来的,如果图像复杂就会花很长时间去处理,而位图就容易处理多了,无论多么复杂的动画,位图总能表现的很好。
32位16进制颜色值的得到方法:假如有0x0A5500EE,则表示alpha的值是0A,R(red)是55,G(green)是00,B(blue)是EE。关于alpha的值,其范围用十进制表示是在0--255之间,用十六进制表示就是00--FF。可以用int.toString(16)来进行十进制到十六进制的转换,如果转换的值为个位,则需要补0,例如1表示为01,e表示为0E
创建位图的一般步骤:
1. 构建一个BitmapData对象:var bitmap:BitmapData = new BitmapData(width,height,transparent,fillColor);
width -- 位图的宽度
height -- 位图的高度
transparent -- 是否创建alpha通道,默认为true
fillColor -- 32位16进制的颜色值,在transparent为true时,默认为0xFFFFFFFF
2. 新建Bitmap对象,以之前新建的BitmapData为参数:var image:Bitmap = new Bitmap(bitmap);
3. 直接添加该Bitmap对象:this.addChild(image);
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var alphaInt:int = 128;
var alphaHex:String = alphaInt.toString(16);
if(alphaHex.length==1)
{
alphaHex = "0" alphaHex;
}
var fillColor:String = "0x" alphaHex "FFFF00";
var bitmap:BitmapData = new BitmapData(200,100,true,uint(fillColor));
var image:Bitmap = new Bitmap(bitmap);
this.addChild(image);
}
}
}
绘制可视化对象到位图上
先在MovieClip或Sprite上画好,然后把对象画到位图上
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var rect:Sprite = new Sprite();
rect.graphics.beginFill(0x00FF00);
rect.graphics.drawRect(30,30,50,50);
rect.graphics.endFill();
var bitmap:BitmapData = new BitmapData(200,100,true,0x80000000);
bitmap.draw(rect);
var image:Bitmap = new Bitmap(bitmap);
image.x = 100;
image.y = 100;
this.addChild(image);
}
}
}
载入外部图片到位图上
使用flash.display.Loader类载入图片,当图片载入完成时,loader的content属性就是一个Bitmap.访问Bitmap的bitmapData属性就在访问载入的图片
package {
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class Sample0310 extends Sprite
{
private var loader:Loader;
public function Sample0310()
{
loader = new Loader();
loader.load(new URLRequest("http://www.yysoft.com/Upload/8/images/ccns_03.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
}
private function onLoadComplete(target:Event):void
{
var circle:Shape = new Shape();
circle.graphics.beginFill(0xFFFF00);
circle.graphics.drawCircle(50,50,25);
circle.graphics.endFill();
var image:Bitmap = loader.content as Bitmap;
image.bitmapData.draw(circle);
this.addChild(image);
}
}
}
得到或设置位图上的像素
使用BitmapData类的getPixel(),setPixel,getPixel32()和setPixel32方法。例如:getPixel(mouseX,mouseY),setPixel(x,y,0xFF00FF00),getPixel()和setPixel()方法是专门为不透明的BitmapData类实例所用,而getPixel32()和setPixel32()则支持alpha通道的位图。可以通过BitmapData 构造器指定是否为透明位图
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Sample0310 extends Sprite
{
private var image:Bitmap;
private var txt:TextField;
public function Sample0310()
{
txt = new TextField();
txt.y = 130;
image = new Bitmap();
image.bitmapData = new BitmapData(100,100,true,0xFFFFFFFF);
image.bitmapData.noise(1000,0,255,1|2|4,false);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
this.addChild(txt);
this.addChild(image);
}
private function onEnterFrame(target:Event):void
{
txt.text = "#" image.bitmapData.getPixel(mouseX,mouseY).toString(16);
}
}
}
创建矩形填充
使用BitmapData类的fillRect()方法
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.geom.Rectangle;
public class Sample0310 extends Sprite
{
public function Sample0310()
{
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(200,100,true,0x80000000);
image.bitmapData.fillRect(new Rectangle(20,20,50,50),0x80FFFF00);
this.addChild(image);
}
}
}
创建充溢填充
所谓充溢填充,就是指完全填充一个不规则的区域。使用BitmapData类的floodFill()方法,调用形式为:floodFill(x,y,color),其中x,y为要填充的坐标点,color为坐标颜色。需要特别这样的是,填充的始终是该坐标点最上层的容器元素
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
public class Sample0310 extends Sprite
{
private var image:Bitmap;
public function Sample0310()
{
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xFFFFFF);
for(var i:uint=0;i<10;i )
{
image.bitmapData.fillRect(new Rectangle(Math.random()*(stage.stageWidth-50),
Math.random()*(stage.stageHeight-50),
30,30),Math.random( ) * 0xffffffff);
}
this.addChild(image);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
}
private function onMouseDown(target:MouseEvent):void
{
image.bitmapData.floodFill(mouseX,mouseY,0x000000);
}
}
}
拷贝位图里的部分像素
利用destBitmapData.copyPixels(sourceBitmapData,sourceRect,destPoint)来将源位图上某个区域的像素,拷贝到目标区域的某个坐标点。
destBitmapData -- 目标位图
sourceBitmapData -- 源位图
sourceRect -- 源位图的矩形区域
destPoint -- 目标位图的拷贝坐标点
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
public class Sample0310 extends Sprite
{
private var loader:Loader;
private var imageContainer:Bitmap;
public function Sample0310()
{
imageContainer = new Bitmap();
imageContainer.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xFFFFFF);
this.addChild(imageContainer);
loader = new Loader();
loader.load(new URLRequest("http://www.yysoft.com/Upload/8/images/ccns_03.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
}
private function onLoadComplete(target:Event):void
{
var image:Bitmap = loader.content as Bitmap;
this.addChild(image);
imageContainer.bitmapData.copyPixels(image.bitmapData,new Rectangle(20,20,50,100),new Point(300,200));
}
}
}
创建噪波图案
使用BitmapData类的noise(seed,low,high,channel,grayscale)
seed -- 随机种子(注意,同一个seed生成的图片是一样的)
low -- 每个像素的最小值,范围在0到255(设置越高图案越亮)
high -- 每个像素的最大值,范围在0到255(设置越高图案越亮)
channel -- 指定把噪波应用到哪个通道上,其值可以是1,2,4,8;或者用BitmapDataChannel类的RED,GREEN,BLUE和ALPHA grayscale -- 一个布尔值,true表示随机值应用到三个通道上(当三个通道的值为相同时,即为灰色)。默认为false
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Sprite;
public class Sample0313 extends Sprite
{
public function Sample0313()
{
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff);
image.bitmapData.noise(1000,128,255,BitmapDataChannel.BLUE,true);
this.addChild(image);
}
}
}
使用阈值
使用BitmapData类的threshold()方法
public function threshold(
sourceBitmapData:BitmapData, //源位图
sourceRect:Rectangle, //源位图要进行比较的区域,全部为sourceBitmapData.rect
destPoint:Point, //从左上角开始把原始位图覆盖到目标位图上,从(0,0)为new Point()
operation:String, //操作符,“<”、“<=”、“>”、“>=”、“==”、“!=”
threshold:uint, //阈值
color:uint = 0, //阈值测试成功时对像素设置的颜色值。默认值为0x00000000
mask:uint = 0xFFFFFFFF, //掩码,分4个通道进行比较,如只比较红色通道:0x00FF0000
copySource:Boolean = false //是否拷贝源位图,为false则只拷贝阈值测试成功的像素。为true则拷贝整个源位图比较区域
):uint
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.geom.Point;
public class Sample0318 extends Sprite
{
public function Sample0318()
{
var rect:Shape = new Shape();
rect.graphics.beginFill(0xFF0000);
rect.graphics.drawRect(15,15,45,45);
rect.graphics.beginFill(0x00FF00);
rect.graphics.drawRect(75,75,45,45);
rect.graphics.beginFill(0x0000FF);
rect.graphics.drawRect(135,135,45,45);
rect.graphics.endFill();
var image:Bitmap = new Bitmap();
image.bitmapData = new BitmapData(200,200,false,0x000000);
image.x = 20;
image.y = 20;
image.bitmapData.draw(rect);
this.addChild(image);
var destImage:Bitmap = new Bitmap();
destImage.bitmapData = new BitmapData(200,200,false,0xFFFFFF);
destImage.x = image.x image.width 15;
destImage.y = image.y;
destImage.bitmapData.threshold(
image.bitmapData,
image.bitmapData.rect,
new Point(),
">",
0x0000FF00,
0XFFFFFF00,
0X00FFFFFF,
true);
this.addChild(destImage);
}
}
}
在位图上应用滤镜
使用BitmapData类的applyFilter()
destBmp.applyFilter(sourceBitmapData, sourceRect, destPoint, filter);
sourceBitmapData -- 要使用的输入位图图像。源图像可以是另一个BitmapData对象,也可以引用当前BitmapData实例
sourceRect -- 定义要用作输入的源图像区域的矩形
destPoint -- 目标图像(当前BitmapData实例)中与源矩形的左上角对应的点
filter -- 用于执行过滤操作的滤镜对象
如果 BitmapData 对象和指定为 sourceBitmapData 参数的对象是同一对象,应用程序将使用该对象的临时副本来执行滤镜。为了获得最佳性能,请避免这种情况
可以直接定义Bitmap.filters属性,它不会直接接触BitmapData的像素数据,因为滤镜只应用在包装BitmapData的Bitmap上
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.Point;
public class Sample0319 extends Sprite
{
private var image:Bitmap;
private var blurFilter:BlurFilter;
private var point:Point;
public function Sample0319()
{
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
this.addChild(image);
blurFilter = new BlurFilter();
point = new Point();
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(target:Event):void
{
for(var i:uint=0;i<100;i )
{
image.bitmapData.setPixel(mouseX Math.random()*20 - 10,
mouseY Math.random()*20 - 10,
0xFFFFFF);
}
image.bitmapData.applyFilter(image.bitmapData,image.bitmapData.rect,point,blurFilter);
}
}
}
位图的淡出
使用BitmapData类的pixelDissolve()方法
seed = pixelDissolve(
sourceBitmapData:BitmapData, //要使用的源位图图像。源图像可以是另一个BitmapData对象,也可以是目标位图自身
sourceRect:Rectangle, //源位图区域的矩形(一般等于目标位图的大小)
destPoint:Point, //目标位图(当前BitmapData实例)中与源矩形的左上角对应的点
randomSeed:int = 0, //用于开始像素溶解的随机种子(第一次可随意定义)
numPixels:int = 0, //每次拷贝多少像素,默认值是源区域(宽度×高度)的1/30
fillColor:uint = 0 //一个ARGB颜色值,用于填充其原值等于目标值的像素(即目标位图淡出为该种颜色) ):int
* 该函数每次调用,都返回用于后续调用的新随机种子值
* 可以通过 已拷贝的像素总数 是否大于 位图宽度×位图高度,来判断是否拷贝完成
package {
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.net.URLRequest;
public class Sample0319 extends Sprite
{
private var imageSmall:Bitmap;
private var imageBig:Bitmap;
private var seed:uint;
private var pixelComplete:uint = 0;
public function Sample0319()
{
var loader:Loader = new Loader();
loader.load(new URLRequest("1.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadSmallComplete);
loader = new Loader();
loader.load(new URLRequest("2.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadBigComplete);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onLoadSmallComplete(event:Event):void
{
var tmp:LoaderInfo = event.target as LoaderInfo;
imageSmall = tmp.loader.content as Bitmap;
this.addChild(imageSmall);
}
private function onLoadBigComplete(event:Event):void
{
var tmp:LoaderInfo = event.target as LoaderInfo;
imageBig = tmp.loader.content as Bitmap;
//this.addChild(imageBig);
//imageBig.x = 200;
}
private function onEnterFrame(event:Event):void
{
if(imageSmall!=null && imageBig!=null)
{
//每次拷贝总像素的1%,如果是30帧播放的话,即1秒完成30%,全部完成要3秒左右
var numPixels:uint = imageSmall.bitmapData.width * imageSmall.bitmapData.height / 100;
seed = imageSmall.bitmapData.pixelDissolve(
imageBig.bitmapData,
imageSmall.bitmapData.rect,
new Point(),
seed,
numPixels);
pixelComplete = numPixels;
if(pixelComplete > imageSmall.bitmapData.width * imageSmall.bitmapData.height)
{
this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
}
}
}
}
滚动位图
使用BitmapData类的scroll(x,y)方法,将图像按一定量的(x,y)像素进行滚动。滚动区域之外的边缘区域保持不变
x -- 水平滚动量
y -- 垂直滚动量
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.LoaderInfo;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
public class Sample0320 extends Sprite
{
private var image:Bitmap;
public function Sample0320()
{
var circle:Shape = new Shape();
circle.graphics.beginFill(0xFFFF00);
for(var i:int=20;i<200;i=i 20)
{
circle.graphics.drawCircle(i,i,10);
}
circle.graphics.endFill();
//this.addChild(circle);
image = new Bitmap();
image.bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
image.bitmapData.draw(circle);
this.addChild(image);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
if(image!=null)
{
image.bitmapData.scroll(-1,-1);
}
}
}
}
相关推荐
为了进一步扩展这种特效,可以考虑结合其他位图操作,如convolution(卷积)来模拟不同类型的素描风格,或者使用blendMode(混合模式)实现更复杂的视觉效果。此外,可以将这些特效封装成自定义类,方便在多个项目中...
### vb位图处理基本操作 #### 一、概述 在VB.NET中,位图处理是一项常用的技术,主要用于图像处理和图形绘制。本文将详细介绍如何在VB.NET中进行位图的基本操作,包括位图的创建与显示等基础功能,并通过具体的...
在Flash AS3编程中,位图的碰撞检测是一项重要的技术,尤其在开发游戏或交互式应用时不可或缺。本文将深入探讨如何实现基于位图的碰撞检测,并通过一个实例来阐述其工作原理。 位图碰撞检测的基本思想是利用位图...
这些知识点覆盖了AS3的多个方面,包括日期和时间管理、字符串操作、数组处理、错误处理、正则表达式使用、XML和JSON处理、事件处理、显示编程、几何结构使用、绘图API、位图操作、过滤显示对象以及使用PixelBender...
在AS3中,它提供了丰富的功能,帮助开发者解析、操作和生成SWF内容。AS3SWF库在Flash平台的开发中扮演着重要角色,尤其是在那些需要与SWF文件进行交互或动态生成SWF内容的应用场景中。 **1. 解析SWF文件** AS3SWF...
在ActionScript 3 (AS3)中,处理GIF图像主要涉及到的是图形解析和动态显示。GIF是一种广泛使用的图像格式,尤其适用于动画,因为它们支持多帧和透明度。AS3作为Adobe Flash Professional和Flex SDK的核心编程语言,...
10. **位图操作**:AS3的BitmapData类提供了直接操作位图的能力,可以实现像素级别的图像处理,如裁剪、旋转、混合等特效。 以上是对“AS3几个特效代码”可能涉及的知识点的详细说明,每个点都可以深入研究,理解并...
7. **图形与舞台操作**:AS3可以直接操作Stage对象,创建形状、文本、位图等,并进行动画处理。了解DisplayObject和DisplayObjectContainer接口以及MovieClip和Sprite类的功能是必要的。 8. **时间轴控制**:AS3...
- **位图操作**:学习如何加载、显示和操作位图图像,包括缩放、旋转等操作。 - **动画制作**:掌握创建简单动画的技术,如帧动画、路径动画等,提高应用的视觉吸引力。 #### 六、高级主题 - **网络通信**:了解...
教程首先从基础概念入手,介绍了AS3的核心语法,包括变量声明、数据类型(如字符串、数字、布尔值)、操作符(如算术、比较和逻辑操作符)以及流程控制语句(如if语句、switch语句、for循环和while循环)。...
总结来说,"flash as3 多点触控-缩放-旋转-滑动.zip"这个压缩包提供了一个实用的示例,它展示了如何在AS3中实现多点触控功能,包括缩放、旋转和滑动操作,这对于开发触摸屏应用的开发者来说是非常有价值的资源。...
在本文中,我们将深入探讨如何使用ActionScript 3(AS3)来创建一个3D菜单。ActionScript是Adobe Flash Professional和Adobe Animate中用于构建交互式内容的主要编程语言,尤其适用于开发网页上的动画和交互元素,如...
7. 事件驱动编程:在AS3中,事件驱动编程是核心概念,用户与界面的交互(如点击、滚动)会触发相应的事件,源码中的事件监听器会响应这些事件并执行相应操作,例如更新图片显示或动画效果。 8. 性能优化:考虑到3D...
BitmapData是AS3中的一个类,它代表了一个位图图像的数据。这个类提供了对图像像素的直接访问和操作,包括读取、写入像素颜色以及进行各种图像处理操作。在创建波浪效果时,BitmapData可以用来存储原始图像,并在...
总之,AS3图片解析数字引擎是一个强大的工具,它简化了AS3环境中图片数据的处理和转换,提供了高效的位图缓存管理、灵活的界面支持以及易于扩展的MVC架构。对于需要在AS3项目中进行复杂图像处理和数字解析的开发者来...
AS3的Loader类可以帮助加载外部资源,而使用位图缓存可以优化大量动态图形的性能。 9. **用户界面(UI)设计** 创建游戏菜单、提示信息、得分显示等UI元素,可以使用AS3的文本、按钮、影片剪辑等组件。理解如何...
AS3的DisplayObject类及其子类可以创建和操作游戏对象的视觉表示。帧动画可以通过MovieClip类实现,而连续移动则需要定时器和更新函数来控制。 7. 游戏逻辑: 包括坦克的生命值、分数系统、游戏胜利和失败条件等。...
5. **并行与并发**:虽然AS3的单线程模型限制了并行处理,但可以利用时间片调度进行一定程度的并发操作。例如,在不同的帧之间执行耗时任务,以避免阻塞主线程。性能测试可以揭示并行与并发策略的效果,帮助改进程序...
在压缩包内的文件"TestZing"可能是一个AS3项目的测试文件,包含了使用ZXing库进行二维码操作的代码实例。通过分析这个文件,开发者可以了解如何集成ZXing到AS3项目中,包括初始化解码器、捕获和解析图像、生成二维码...
6. **ActionScript与图形**:AS3可以动态创建、修改和绘制图形,包括线条、形状、位图等,使用Graphics类的方法进行操作。 7. **网络通信**:AS3提供了一系列的类如URLLoader和XMLSocket,用于实现HTTP请求、...