BitmapData

一个 Bitmap 对象可在若干 Bitmap 对象之中共享其 BitmapData 引用,与转换属性或旋转属性无关。
由于能够创建引用相同 BitmapData 对象的多个 Bitmap 对象,因此,多个显示对象可以使用相同的复杂 BitmapData 对象,
不会因为每个显示对象实例使用一个 BitmapData 对象而产生内存开销

示例1:创建500个位图,每个位图使用不同引用的BitmapData的内存

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.system.System;
//打印初始的内存情况
trace("开始空闲时内存: "+System.totalMemory/1000+"k");
var bmpdt:BitmapData;
for(var i:int=0;i<500;i++)
{
    //每次都是新的bitmapData给bitmap
    bmpdt=new BitmapData(100,100,false,0xffccdd);
    var bmp:Bitmap=new Bitmap(bmpdt);
    addChild(bmp)
    bmp.x=i+3;
    bmp.y=i+3;
}
trace("创建完毕后内存: "+System.totalMemory/1000+"k");

结果:
开始空闲时内存: 34328.576k
创建完毕后内存: 55169.024k

示例2:创建500个位图,每个位图使用了同一个BitmapData的引用

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.system.System;
//打印初始的内存情况
trace("开始空闲时内存: "+System.totalMemory/1000+"k");
var bmpdt:BitmapData=new BitmapData(100,100,false,0xffccdd);;
for(var i:int=0;i<500;i++)
{
    var bmp:Bitmap=new Bitmap(bmpdt);
    addChild(bmp)
    bmp.x=i+3;
    bmp.y=i+3;
}
trace("创建完毕后内存: "+System.totalMemory/1000+"k");

结果:
开始空闲时内存: 34373.632k
创建完毕后内存: 34799.616k

像素贴紧和平滑

bmp.smoothing=true;位图缩放时 会模糊 。使用 Bitmap.smoothing=true;会让图像更平滑自然,也会更加消耗性能
应用滤镜
在将 smoothing 设置为 true 的情况下绘制位图要比在将 smoothing 设置为 false 的情况下执行相同操作更为缓慢。

import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.filters.BlurFilter;
import flash.display.Bitmap;
//创建bitmapData
var bmpdt:BitmapData=new BitmapData(80,30,false,0xffccdd);
//创建一个Rectangle 这个rect会指定到bitmapdata的坐标上
var rect:Rectangle=new Rectangle(20,10,40,10);
//对这个区域 填充颜色
bmpdt.fillRect(rect,0x0033ff);

//获取这个矩形的左上角坐标
var pt:Point=new Point(rect.left,rect.top);
var blFilter:BlurFilter=new BlurFilter(8,8,1);
bmpdt.applyFilter(bmpdt,rect,pt,blFilter);

var bmp:Bitmap=new Bitmap(bmpdt);
addChild(bmp);

滤镜
滤镜和位图缓存:若要对显示对象应用滤镜,必须启用该对象的位图缓存。在对 cacheAsBitmap 属性设置为false 的显示对象应用滤镜时,Flash Player 会自动将该对象的 cacheAsBitmap 属性的值设置为 true。如果您以后删除了该显示对象中的所有滤镜,Flash Player 会将 cacheAsBitmap 属性重置为最后设置的值。
在运行时更改滤镜:如果已经对显示对象应用了一个或多个滤镜,则无法向 filters 属性数组添加其它滤镜。若要添加或更改应用的这组滤镜,需要创建整个滤镜数组的副本,然后对此(临时)数组进行修改。然后,将此数组重新分配给显示对象的 filters 属性,这样才能将滤镜应用于该对象。
滤镜示例:

var bmpdt:BitmapData=new BitmapData(100,100,true,0xffccddee);
var bmp:Bitmap=new Bitmap(bmpdt);
addChild(bmp);

var filter:BlurFilter=new BlurFilter(10,10,1);
//声明一个rectangel 坐标是绝对坐标和区域
var rect:Rectangle=new Rectangle(50,50,50,50);
var p:Point=new Point(50,50);
//必须有填充色 否则滤镜无效
bmpdt.fillRect(rect,0xffFF0000);
bmpdt.applyFilter(bmpdt,rect,p,filter);

colorTransform示例:
var bmd1:BitmapData = new BitmapData(100,100,true,0xffffccdd);
var bmp:Bitmap=new Bitmap(bmd1);
addChild(bmp);
var clorTran:ColorTransform=new ColorTransform();
//颜色转换 透明度设置0.7
clorTran.alphaMultiplier=0.7;
var rect:Rectangle=new Rectangle(50,50,20,20);
//对 Bitmapdata设置colorTranform
bmd1.colorTransform(rect,clorTran);

复制像素

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
//目标Bitmapdata 待被复制
var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF);
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44);
//原始Bitmapdata打个标记
bmd1.setPixel(15,15,0x00ff0000);
var rect:Rectangle = new Rectangle(10, 10, 10, 10);
var pt:Point = new Point(30, 10);
//从Bitmapdata源的rect区域复制到 pt里
bmd2.copyPixels(bmd1, rect, pt);

var bm1:Bitmap = new Bitmap(bmd1);
this.addChild(bm1);
var bm2:Bitmap = new Bitmap(bmd2);
this.addChild(bm2);
bm2.x = 50;

draw()
BitmapData.draw(source:IBitmapDrawable):void
DisplayObject 和 BitmapData 类实现了 IBitmapDrawable接口

floodFill类似Flash工具里的油漆桶

var bmpdt:BitmapData=new BitmapData(200,200,false,0xff0000);
var rect:Rectangle=new Rectangle(0,0,100,100);
bmpdt.fillRect(rect,0x00ff00);
rect.x=50;
rect.y=50;
bmpdt.fillRect(rect,0x0000ff);
rect.x=100;
rect.y=100;
bmpdt.fillRect(rect,0xff00ff);
//floodFill相当于油漆桶倾倒功能
bmpdt.floodFill(90,90,0xffccee)
var bmp:Bitmap=new Bitmap(bmpdt);
addChild(bmp);

getPixels(rectangle)
从像素数据的矩形区域生成一个字节数组。为每个像素将一个无符号整数(32 位未经相乘的像素值)写入字节数组。

import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.display.Bitmap;
import flash.utils.ByteArray;

var bmd:BitmapData = new BitmapData(a.width, a.height, true);
bmd.draw(a);
var bounds:Rectangle = new Rectangle(0, 0, bmd.width, bmd.height);
//BitmapData.getPixels(rectangel):ByteArray 获取图像数据的一个Rectangle的二进制数据
var pixels:ByteArray = bmd.getPixels(bounds);
trace(pixels)
时间: 2024-08-24 19:20:57

BitmapData的相关文章

AS3中BitmapData的draw()平移转换

要绘制对象的定位点不在图像的左上角时,draw需要平移转换 var mc:MovieClip; var rect:Rectangle = mc.getBounds(mc); var bmd:BitmapData=new BitmapData(int(rect.width.toFixed()) ,int(rect.height.toFixed()),true,0); bmd.draw(mc, new Matrix(1, 0, 0, 1,- rect.x, - rect.y)); stage.add

(转)C#进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素数据定义的图像的对象. 利用C#类进行图像处理,最方便的是使用Bitmap类,使用该类的GetPixel(

as3.0 从Loader得到BitmapData

直接代码如下 import flash.display.Loader; import flash.net.URLRequest; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; var loader:Loader = new Loader(); var imgUrl:URLRequest = new URLRequest('123.jpg'); loader.cont

验证码图片二值化问题 BitmapData 怎么解决

对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色的小点点呢?原来都是没有的-- 谁能帮我看看代码怎么改!谢谢大牛们帮忙!! Bitmap bit1 = new Bitmap(bit); Rectangle rect1 = new Rectangle(0, 0, bit1.Width, bit1.Height); BitmapData bitd =

bitmapdata的知识点

flashplayer的cpu渲染 bitmapData占用的内存分两块,一块是原始数据区,另一块是解压后的内存区10秒内如果没有使用这个bitmapdata,解压后的内存区会被释放,当10秒后重新使用,这个bitmapdata会再次解压,所以就会造成某些页游几秒钟一定会卡一下的现象,这个现象在手机上最严重另外,copy出来会变成三份内存,或者当你无意中缩小了位图,也会变成三份内存.2dx和flash的位图机制都是如此 fp用cpu渲染,消耗大量CPU是因为要解压 ,解压后的数据经过CPU渲染到

[ActionScript 3.0] 通过BitmapData将对象保存成jpg图片

此方法需要用到JPGEncoder.as和BitString.as这两个类,是将BitmapData对象转换成ByteArray,然后通过FileStream把此ByteArray写入到文件保存成jpg图片,因为用到File相关类,故需要用air播放器发布flash,在此提供两个下载JPGEncoder.as和BitString.as类的地址, CSDN:http://download.csdn.net/source/3205224 Adobe官方的CoreLib下载: http://code.

C#中Image , Bitmap 和 BitmapData

先说Image,Image 就是个图像,不能实例化,提供了位图和源文件操作的函数.本篇文章他就是来打酱油的,这里提供一个Bitmap转成BitmapSource的方法. 1 [DllImport("gdi32")] 2 static extern int DeleteObject(IntPtr o); 3 /// <summary> 4 /// bitmap转换为bitmapsource 以适应wpf的image 5 /// </summary> 6 /// &

createjs 的 bitmapdata类

今天测试一个功能,在效率上出现了问题.2D舞台绘制了大量的元素,联想到AS3的 bitmapdata.darw() 功能,遗憾是createjs官方类 中没有bitmapdata类. 好在已经有大神替我们完成这个开发. https://github.com/u-kudox/BitmapData_for_EaselJS 实测了几个功能效果不错.极大的提高了效率. 实际项目使用,请务必测试!

[ActionScript 3.0] AS3中的位图(BitmapData)应用

1.位图使用(模糊)滤镜 //创建一个矩形区域的BitmapData var bmd:BitmapData = new BitmapData(80, 30, false, 0xffffff); //画个红色的矩形 var rect:Rectangle = new Rectangle(20, 10, 40, 10); bmd.fillRect(rect, 0xFF0000); //找到红色矩形的右上顶点 var pt:Point = new Point(rect.left, rect.top);

Bitmap BitmapData

var sp:Sprite=new Sprite(); sp.graphics.beginFill(0xffccdd); sp.graphics.drawRect(0,0,100,100); sp.graphics.beginFill(0x33eedd); sp.graphics.drawRect(100,0,100,100); addChild(sp); sp.x=300; var bmpdt:BitmapData=new BitmapData(200,100); var bmp:Bitmap