`
joe.feng
  • 浏览: 134813 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

BitmapData

    博客分类:
  • Flex
 
阅读更多

可以使用BitmapData对象加载图片,BitmapData允许使用像素层级来控制位图,其优势如下:

 

  • 可以复制、粘贴整个图像、部分图案,或者是每一个独立的像素。
  • 可以鉴别或是改变像素或像素群组的颜色。
  • 可以应用滤镜。
  • 可以创建随机的像素(noise或perlin noise)等。
  • 可以把位图通过encodeBase64方法生成Base64编码字符串存入数据库,使用时通过decodeBase64还原成BitmapData位图对象就可以了。 
1、使用BitmapData得到图像数据
1.1、使用BitmapData的draw方法得到图像数据:
[Bindable]
[Embed(source="assets/img/music.png")]
private var img:Class;

private function init():void{
	var bd:BitmapData = new BitmapData(img1.width, img1.height);
	bd.draw(img1);
	img2.source = new BitmapAsset(bd);
}

<s:VGroup id="vg" width="200" height="200">
	<s:Image id="img1" source="{img}" />
	<s:Image id="img2" />
</s:VGroup>
  1.2、在flex3中,也可以用如下方法得到图像数据:
private function init():void{
	var bd:BitmapData = Bitmap(img1.content).bitmapData;
	img2.source = new BitmapAsset(bd);
}

2、将图片转换成ByteArray和Base64格式数据
有两种方法,一种是使用PNGEncoder或JPEGEncoder对象的encode方法将BitmapData转为ByteArray格式数据;另一种是在前一个基础上,使用Base64Encoder对象的encodeBytes将ByteArray转为Base64格式数据。如果要显示出来,还要转成String格式。
将BitmapData转成ByteArray格式数据后可以使用compress()将数据压缩,要显示图片时,取出ByteArray后调用uncompress()方法将数据解压缩。

[Bindable]
[Embed(source="assets/img/music.png")]
private var img:Class;

protected function btn_clickHandler(event:MouseEvent):void
{
	var bd:BitmapData = new BitmapData(img1.width, img1.height);
	bd.draw(img1);
	//也可以使用JPEG格式 new JPEGEncoder(100);
	var encoder:PNGEncoder = new PNGEncoder();
	//转换为二进制数据
	var bytes:ByteArray = encoder.encode(bd);
	var base64:Base64Encoder = new Base64Encoder();
	base64.encodeBytes(bytes);
	//把ByteArray转为Base64编码的字符串
	var imgStr:String = base64.toString();
	ta.text = imgStr;
}

<s:Image id="img1" source="{img}" />
<s:Button id="btn" label="Encode" click="btn_clickHandler(event)"/>
<s:TextArea id="ta" width="300" height="200" />

3、将ByteArray和Base64格式数据转成图片
如果是Base64格式的数据,要先使用Base64Decoder对象decode解码后转换成ByteArray格式,然后使用Image组件的load方法显示。mx包里面的Image才有load方法,spark包里面的Image没有load方法。
protected function btn1_clickHandler(event:MouseEvent):void
{
	var base64Dec:Base64Decoder = new Base64Decoder();
	base64Dec.decode(ta.text);
	var bytes:ByteArray = base64Dec.toByteArray();
	img2.load(bytes);
}

<s:Image id="img1" source="{img}" />
<s:Button id="btn" label="Encode" click="btn_clickHandler(event)"/>
<s:TextArea id="ta" width="300" height="200" />
<s:Button id="btn1" label="Show" click="btn1_clickHandler(event)" />
<mx:Image id="img2" />
深入理解BitmapData和Bitmap类:
  • BitmapData存储图片的像素数据,可以看做是加载的或动态创建的位图图像中包含的像素的照片快照。
  • Bitmap可以看做是BitmapData对象的包装。多用于Flash中,通常的用法是将BitmapData作为参数实例化Bitmap类(new Bitmap(bitmapData),实例化得到的这个Bitmap对象就是一幅图片了,将该对象添加到舞台或sprite容器即可。例如:
var myImage:Bitmap = new Bitmap(myBitmapDataObject);
addChild(myImage);
  • Bitmap类不是InteractiveObject类的子类,因此它无法调度鼠标事件。可以使用包含Bitmap对象的容器(例如sprite)来调度鼠标事件。
  • 在Flex中,Bitmap是无法直接添加到Flex的舞台或容器中的,所以在得到BitmapData数据后一般会使用Image组件(Bitmap或BitmapAsset作为Image的source)将图片显示出来。加载ByteArray数据时也是用Image的load方法来显示图片。用Bitmap加载ByteArray数据代码如下:
protected function btn1_clickHandler(event:MouseEvent):void
{
	var base64Dec:Base64Decoder = new Base64Decoder();
	base64Dec.decode(ta.text);
	var bytes:ByteArray = base64Dec.toByteArray();
	var load:Loader = new Loader();
	load.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
	load.loadBytes(bytes);
}

private function onComplete(event:Event):void{
	var bm:Bitmap = event.target.content as Bitmap;
	var ui:UIComponent = new UIComponent();
	ui.addChild(bm);
	this.addChild(ui);
}

4、创建图片快照
使用ImageSnapshot类的静态方法captureImage为任何组件创建图片快照,创建快照后可以转为Base64格式数据或ByteArray格式数据。
注意,是任何组件,一般用于生成客户端图像的PDF文件。
private var jpegEnc:JPEGEncoder = new JPEGEncoder();
private var pngEnc:PNGEncoder = new PNGEncoder();

private function capImg(imgEnc:IImageEncoder):void{
	var snap:ImageSnapshot;
	snap = ImageSnapshot.captureImage(img1, 0 ,imgEnc);
	ta.text = ImageSnapshot.encodeImageAsBase64(snap);
	var bytes:ByteArray = snap.data as ByteArray;
	img2.load(bytes);
}

<s:Image id="img1" source="{img}" />
<s:Button id="btn" label="capture jpeg" click="capImg(jpegEnc)"/>
<s:Button id="btn1" label="capture png" click="capImg(pngEnc)" />		
<s:TextArea id="ta" width="300" height="200" />
<mx:Image id="img2" />

5、在图片上取色
通过BitmapData对象的getPixel方法返回一个整数,表示BitmapData对象中在特定点(x, y)处的RGB像素值。下面代码实现一个取色器的功能。
protected function img1_mouseMoveHandler(event:MouseEvent):void
{
	var point:int = bd.getPixel(event.localX, event.localY);
	pl.setStyle("backgroundColor", point);				
	ta.text = "#" + point.toString(16).toUpperCase();
}

<s:Image id="img1" source="{img}" mouseMove="img1_mouseMoveHandler(event)" />
<s:Panel id="pl" width="200" height="200" />				 
<s:TextArea id="ta" width="300" height="200" />

6、图像复制
[Bindable]
private var acImage:ArrayCollection = new ArrayCollection();
protected function btn_clickHandler(event:MouseEvent):void
{
	var bd:BitmapData = new BitmapData(img1.width, img1.height);
	bd.draw(img1);
	var bm:Bitmap = new Bitmap(bd); 
	acImage.addItem({image:bm});
}

<mx:Image id="img1" source="{img}" />
<mx:Button id="btn" label="copy image" click="btn_clickHandler(event)" />
<mx:Repeater id="repeat" dataProvider="{acImage}">
	<mx:Image source="{repeat.currentItem.image}" />
</mx:Repeater>

7、图片的截取
图像的截取用途很广泛,例如需要自定义用户头像的功能,因为用户上传的图像大小不一,可以设置一个尺寸固定的矩形,允许用户拖动矩形来截取自己上传的图片。
protected function btn_clickHandler(event:MouseEvent):void
{
	var bd:BitmapData = new BitmapData(img1.width, img1.height);
	bd.draw(img1);					
	var rect:Rectangle = new Rectangle(0,0,100,100);
	var bd1:BitmapData = new BitmapData(rect.width, rect.height);
	var point:Point = new Point(0,0);
	bd1.copyPixels(bd,rect,point,null,null,false);
	var bm:Bitmap = new Bitmap(bd1);
	img2.load(bm);
}

<s:Image id="img1" source="{img}" />
<s:Button id="btn" label="cut image" click="btn_clickHandler(event)" />
<mx:Image id="img2" />
使用copyPixels方法复制原始图像的一部分来实现截取,主要设置前三个参数:原始图像数据、复制区域大小、复制的起始点。
分享到:
评论

相关推荐

    [转] BitmapData 基础部分2

    BitmapData是ActionScript 3(AS3)中的一个核心类,它是处理像素数据的主要工具,广泛应用于游戏开发、图像处理和动画制作等场景。在AS3中,BitmapData类允许我们创建、读取、修改和操作位图数据,这些位图数据可以...

    BitmapData.draw方法

    BitmapData.draw方法是ActionScript 3.0中的一个重要功能,主要用在Adobe Flash环境中处理位图数据。这个方法允许开发者将一个显示对象(如Sprite、MovieClip或Bitmap)的可视内容复制到BitmapData对象上,从而实现...

    ActionScript 3 BitmapData 的例子

    bitmapData.applyFilter(bitmapData, new Rectangle(0, 0, bitmapData.width, bitmapData.height), new Point(), filter); ``` 6. 图像合并与混合模式 利用`merge()`方法,可以将两个BitmapData对象合并,同时可以...

    使用C#的BitmapData

    在C#中,`BitmapData`类是用于高效地访问和操作位图图像像素的核心类。这个类在处理大量像素操作时尤其有用,因为它允许直接访问图像数据的内存缓冲区,而无需通过昂贵的属性访问。`BitmapData`提供了一种优化的方法...

    BitmapData.pas和kbKernel.pas

    BitmapData.pas 和 kbKernel.pas 这两个文件在IT领域中主要涉及到图像处理和自动化操作,特别是游戏或图形应用中的找图找色功能。在本文中,我们将深入探讨这两个关键概念及其在实际编程中的应用。 首先,...

    delphi 找图找色 BitmapData.pas

    delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/

    BitmapData.zip

    BitmapData.zip 文件是一个包含 Delphi 开发中使用的 BitmapData 单元的压缩包。这个单元主要是为了实现图像处理和颜色查找功能,对于 Delphi 开发者来说,它提供了一个高效且方便的工具来搜索和操作图像数据。让...

    as2.0amlabfire.zip_BitmapData_True Blue

    as2.0 模拟火焰 import flash.display.*...var blueSpot: BitmapData = new BitmapData( clipBounds.xMax, clipBounds.yMax, true, 0 ) blueSpot.draw( blueSpotClip, new Matrix() ) blueSpotClip.removeMovieClip()

    [心得] draw的技巧,说说BitmapData(附源码)

    BitmapData是ActionScript 3(AS3)中的一个核心类,它是Adobe Flash Professional和Flex开发中的重要组成部分。这篇心得分享了关于使用BitmapData的一些高级技巧,以及如何利用它来提升图形绘制的效率和效果。...

    Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar

    这个压缩包"Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar"显然包含了关于如何在AS3中使用BitmapData的CopyPixel方法来创建或修改位图的示例和教程。 BitmapData对象是AS3中表示位图图像的数据结构,它可以...

    SWT中的bitmapdata,和自己封装的image工具类

    BitmapData是SWT库中一个关键的类,它用于处理位图数据,允许开发者直接操作图像的像素。在这个主题中,我们将深入探讨BitmapData以及如何与自定义的Image工具类配合使用。 BitmapData类提供了对图像数据的低级别...

    王者找图对比程序.rar_BitmapData.pas_delphi 找图_对比找图_王找找图_王者找图对比程序

    王者找图对比程序,delphi制作,设定一个图,找另一个图上是否有这个图!

    BitmapData_for_EaselJS:用于EaselJS的BitmapData将AS3(例如BitmapData)添加到EaselJS

    EaselJS的位图数据EaselJS的BitmapData将AS3(例如BitmapData)添加到EaselJS。例1 // create BitmapData by HTMLImageElement_bmd01 = new createjs.BitmapData(HTMLImageElement);_bitmap01 = new createjs.Bitmap...

    位图噪声效果BitmapData类的运用

    BitmapData类实例 运用噪声制作一些好的效果 源码

    用c#实现图像处理:获取一幅图片的像素值及RGB分量

    BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat); int stride = bitmapData.Stride; byte[] pixels = new byte[bitmapData.Stride * bitmap.Height]; Marshal.Copy...

    数字图像处理算法例子,数字图像处理算法例子

    System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat); IntPtr ptr = bmpData.Scan0; int bytes = curBitmap.Width ...

    typescript-definition-bitmapdata-for-easeljs:CreateJS 的 BitmapData 的 TypeScript 定义

    CreateJS 的 BitmapData 的 TypeScript 定义。 这是一个定义文件,用于将 BitmapData 类用于 CreateJS 和 TypeScript。 如何使用 是定义文件体。 请从 TypeScript 程序中读取并使用它。 请注意,单独使用此文件是...

    C#数字图像处理的3种方法

    本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个重要的类。  Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下:  ...

    as3 等比切割图片,一键切割图片保存+自动命名图片

    var bitmapData:BitmapData = img.bitmapData; var originalRatio:Number = bitmapData.width / bitmapData.height; // 自定义切割的宽高比例 var cutRatio:Number = 4 / 3; // 例如,4:3比例 var cutWidth:...

    Flash as3基于位图的碰撞检测实例

    var bitmapData:BitmapData = new BitmapData(displayObject.width, displayObject.height, false, 0); bitmapData.draw(displayObject); ``` 2. **位图数据比较**:有了BitmapData对象后,我们可以使用`hitTest()`...

Global site tag (gtag.js) - Google Analytics