`
ioryioryzhan
  • 浏览: 154626 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

得到控件的BitmapData位图信息,来做效果

阅读更多

尝试得到控件的快照,就像位图信息,然后用来做效果。查查文档,真的可以。BitmapData 有一个draw()方法便可以做到,它可以像照相机一样对控件进行拍照,得到控件的位图信息。

draw() 方法的声明:

 

public function draw(source:IBitmapDrawable, 
				matrix:Matrix = null, 
				colorTransform:ColorTransform = null, 
				blendMode:String = null, 
				clipRect:Rectangle = null, 
				smoothing:Boolean = false):void

 

关注前面两个参数,source 参数是目标控件,matrix 参数决定怎样来拍照。matrix 是一个矩阵,不同的设置,得到的位图信息就不相同。见下图:

还没玩到那么花哨,现在只用到它的tx,ty。

图中是一个3x3的矩阵,其实只能用前两行的6个。

 

得到位图信息后,便可以为所欲为了,哈。

用这个方法做了个效果,与大家分享。

 

 

点击下方的按钮便可以将Panel拆来拆去了。

 

代码不多,直接贴出来了,同时思考能否用这种方法做出百叶窗的效果:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"
  verticalScrollPolicy="off" horizontalScrollPolicy="off" width="500" height="500">
	<mx:Script>
		<![CDATA[
			import mx.events.EffectEvent;
			import mx.effects.Move;
			import mx.effects.Parallel;
			import mx.states.AddChild;
			import mx.controls.Image;			
			private var bitmapData:BitmapData = null; 
			
			private var matrix1:Matrix = null;
			private var matrix2:Matrix = null;
			private var matrix3:Matrix = null;
			private var matrix4:Matrix = null;
			
			internal var image1:Image=null,image2:Image=null,image3:Image=null,image4:Image=null;
			internal var isPanelShow:Boolean = true;
			
			internal function init():void{		
				
				matrix1 = new Matrix(1,0,0,1,0,0);
				matrix2 = new Matrix(1,0,0,1,-panel.width/2,0);
				matrix3 = new Matrix(1,0,0,1,0,-panel.height/2);
				matrix4 = new Matrix(1,0,0,1,-panel.width/2,-panel.height/2);
				
				image1 = new Image();
				image2 = new Image();
				image3 = new Image();
				image4 = new Image();
						
				addChild( initImageFromMatrix( image1 ,matrix1 ));		
				addChild( initImageFromMatrix( image2 ,matrix2 ));
				addChild( initImageFromMatrix( image3 ,matrix3 ));
				addChild( initImageFromMatrix( image4 ,matrix4 ));		
				
				image1.width = image2.width = image3.width = image4.width = panel.width/2;
				image1.height = image2.height = image3.height = image4.height = panel.height/2;				
				image1.visible = image2.visible = image3.visible = image4.visible = false;
				image1.scaleContent = image2.scaleContent = image3.scaleContent = image4.scaleContent = false;
				setChildrenTop([image1,image2,image3,image4]);
				
				panel.visible = true;
				btnShow.addEventListener(MouseEvent.CLICK,onClickShowOrHide);				
				
			}
		
			internal function initImageFromMatrix(image:Image, matrix:Matrix):Image{
				if(image == null) return null;
				image.load( new Bitmap( getBitmapDataFromMatrix( matrix ) ) );
				trace(image);
				return image;
			}			
			internal function setChildrenTop( array:Array ):void{
				if(!array)return;
				var len:int = array.length;
				if(len == 0 ) return;
				var displayObject:DisplayObject = null;
				for(var i:int = 0; i <len ; ++i){
					displayObject = array[i] as DisplayObject;
					setChildIndex(displayObject ,numChildren-1 );
				}
			}
			internal function getBitmapDataFromMatrix(matrix:Matrix):BitmapData{
				var bitmapData:BitmapData = new BitmapData(panel.width/2,panel.height/2);
				bitmapData.draw(panel,matrix);
				return bitmapData;
			}
			internal function onClickShowOrHide( e:MouseEvent ):void{	
				if(isPanelShow  == false){
					createEffectsShow();					
				}else{
					createEffectsHide();
				}				
				btnShow.enabled = false;					
			}
			internal function createEffectsHide():void{
				getCurrentBitmapData();
				image1.visible = image2.visible =image3.visible=image4.visible= true;
				panel.visible = false;
				var parallel:Parallel = new Parallel();
				
				var move1:Move = new Move(image1);			
				move1.xTo = 0 - panel.width/2;
				move1.xFrom   = panel.x;
				move1.yTo = 0 - panel.height/2;
				move1.yFrom   = panel.y;	
				
				var move2:Move = new Move(image2);			
				move2.xTo = width;
				move2.xFrom   = panel.x + panel.width/2;
				move2.yTo = 0 - panel.height/2;
				move2.yFrom   = panel.y;		
				
				var move3:Move = new Move(image3);			
				move3.xTo = 0 - panel.width/2;
				move3.xFrom   = panel.x;
				move3.yTo = height;
				move3.yFrom   = panel.y + panel.height/2;		
				
				var move4:Move = new Move(image4);			
				move4.xTo = width;
				move4.xFrom   = panel.x + panel.width/2;
				move4.yTo = height;
				move4.yFrom   = panel.y + panel.height/2;	
				
				parallel.children = [move1,move2,move3,move4];	
				parallel.addEventListener(EffectEvent.EFFECT_END, onHideEffectEnd);
				parallel.duration = 1000;
				parallel.play();
			}
			internal function getCurrentBitmapData():void{
				initImageFromMatrix( image1 ,matrix1 );
				initImageFromMatrix( image2 ,matrix2 );
				initImageFromMatrix( image3 ,matrix3 );
				initImageFromMatrix( image4 ,matrix4 );
			}
			internal function createEffectsShow():void{
				getCurrentBitmapData();
				image1.visible = image2.visible =image3.visible=image4.visible= true;
				panel.visible = false;
				var parallel:Parallel = new Parallel();
				
				var move1:Move = new Move(image1);			
				move1.xFrom = 0 - panel.width/2;
				move1.xTo   = panel.x;
				move1.yFrom = 0 - panel.height/2;
				move1.yTo   = panel.y;	
				
				var move2:Move = new Move(image2);			
				move2.xFrom = width;
				move2.xTo   = panel.x + panel.width/2;
				move2.yFrom = 0 - panel.height/2;
				move2.yTo   = panel.y;		
				
				var move3:Move = new Move(image3);			
				move3.xFrom = 0 - panel.width/2;
				move3.xTo   = panel.x;
				move3.yFrom = height;
				move3.yTo   = panel.y + panel.height/2;		
				
				var move4:Move = new Move(image4);			
				move4.xFrom = width;
				move4.xTo   = panel.x + panel.width/2;
				move4.yFrom = height;
				move4.yTo   = panel.y + panel.height/2;	
				
				parallel.children = [move1,move2,move3,move4];	
				parallel.addEventListener(EffectEvent.EFFECT_END, onShowEffectEnd);
				parallel.duration = 1000;
				parallel.play();
			}
			internal function onShowEffectEnd(e:EffectEvent):void{
				image1.visible = image2.visible = image3.visible= image4.visible =  false;
				panel.visible  = true;
				btnShow.enabled = true;				
				btnShow.label = "点击隐藏Panel";
				isPanelShow = true;
			}
			internal function onHideEffectEnd(e:EffectEvent):void{
				image1.visible = image2.visible = image3.visible= image4.visible =  false;
				panel.visible  = false;
				btnShow.enabled = true;
				isPanelShow = false;
				btnShow.label = "点击显示Panel";
			}
		]]>
	</mx:Script>
	<mx:Panel id="panel"  x="125" y="138" width="250" height="200" layout="absolute">
		<mx:Button x="26" y="119" label="加入GCD" height="31" width="83"/>
		<mx:Button x="140" y="119" label="取  消" height="31" width="86"/>
		<mx:TextInput x="69" y="10"/>
		<mx:TextInput x="69" y="46"/>
		<mx:Label x="13" y="14" text="姓什么:"/>
		<mx:Label x="14" y="49" text="叫什么:"/>
		<mx:Label x="13" y="91" text="男的女的:"/>
		<mx:RadioButton x="101" y="89" label="男"/>
		<mx:RadioButton x="162" y="89" label="女"/>
	</mx:Panel>
	<mx:Button id="btnShow" x="173" y="368" label="点击隐藏Panel" height="37" width="154"/>
	<mx:Style>
Application {
   backgroundColor: #a7a75e;
   backgroundGradientColors: #999966, #585821;
   backgroundGradientAlphas: 0.52, 0.46;
   themeColor: #9d9d24;
   color: #000000;
   fontSize:12;
}
Panel {
   borderColor: #893654;
   borderAlpha: 0.92;
   borderThicknessLeft: 6;
   borderThicknessTop: 1;
   borderThicknessBottom: 9;
   borderThicknessRight: 5;
   roundedBottomCorners: false;
   cornerRadius: 0;
   headerHeight: 26;
   backgroundAlpha: 0.68;
   highlightAlphas: 0.58, 0.16;
   headerColors: #744848, #5a1f1f;
   footerColors: #6c3131, #682b2b;
   backgroundColor: #4f2929;
   shadowDistance: 6;
   dropShadowColor: #4b3737;
}
Button {
   cornerRadius: 0;
   textIndent: 0;
   fillAlphas: 0.39, 0.81, 0.42, 0.41;
   fillColors: #181a47, #120e39, #1d154f, #110f3e;
   color: #1f070c;
   textRollOverColor: #3e0931;
   textSelectedColor: #470e36;
   borderColor: #080808;
   themeColor: #161352;
}
	</mx:Style>
</mx:Application>


 
分享到:
评论
1 楼 NewTamato 2008-09-18  
楼主能否吧代码写上注释呢?或者把这个程序的原理再将清楚一些!

相关推荐

    位图转数组工具

    例如,如果使用WTL,可以创建一个`CBitmap`对象,然后调用`CreateDIBSection`函数来从内存中的数组创建一个设备无关位图(DIB): ```cpp CBitmap bitmap; HBITMAP hBitmap = NULL; // 创建DIBSection,参数包括...

    基于vc++的位图图片三原色的提取

    - 在对话框中展示颜色扫描结果,可以创建一个`CStatic`控件,将其类型设置为`SS_BITMAP`,然后使用`SetBitmap()`方法加载一个临时的位图对象,该对象包含了提取的颜色信息。 6. **内存管理**: - 记得在完成像素...

    as3 图片处理,以及控件对其方式的控制

    在这个主题中,我们将深入探讨如何使用AS3来实现图片的基本操作,如亮度调整、灰度转换、色调变化以及控件对齐方式的控制。 1. **亮度调整**: AS3中的`BitmapData`类提供了改变图像亮度的功能。通过`...

    在flex的dataGrid控件中显示图片的实践

    - 在`updateDisplayList()`方法中,利用`BitmapData`和`flash.display.Bitmap`类,将接收到的二进制数据转换成位图,并赋值给Image组件。 4. **数据传输**:在Spring和Hibernate环境中,我们需要设置一个服务层,...

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

    这里假设有一个名为`pictureBox`的`PictureBox`控件,用于显示图像,以及一个名为`labelPixelInfo`的`Label`控件来显示像素信息。 5. **图像处理操作**: 获取像素值后,可以执行各种图像处理操作,比如改变颜色...

    Flash图片切换效果

    例如,预加载图片到内存,使用位图数据(BitmapData)进行高效的图像处理。 8. **响应式设计**:尽管Flash在移动设备上的支持不理想,但一个良好的图片切换效果应考虑不同屏幕尺寸和方向的适配。 9. **用户交互**...

    从资源文件显示PNG图片的类

    PNG文件格式是公开的,遵循RFC 2083标准,可以通过解析PNG头信息、颜色类型、压缩方法、IDAT块等来解码图片。这需要深入理解PNG文件结构和位图数据转换。 3. **利用.NET Framework**:VB6.0可以与.NET Framework...

    c#.net Bitmap类的基本使用方法

    - `UnlockBits(BitmapData bitmapData)`:解锁之前用`LockBits`锁定的位图部分。 - `Save(string filename, ImageFormat format)`:将位图保存到指定文件,支持多种格式(如JPEG、PNG等)。 - `DrawImage(Image ...

    Visual C#图像处理程序设计实例

    在C#中,我们可以使用Image类的FromFile方法从文件加载图像,然后使用PictureBox控件来显示图像。以下是一个简单的示例: ```csharp using System.Drawing; // 加载图像 Image image = Image.FromFile("path_to_...

    VB显示剪切板上的图片

    在VB中,由于内置的控件和函数不直接支持剪切板图像操作,因此我们需要借助Windows API(应用程序接口)来进行扩展。 API函数是Windows操作系统提供的一组预定义函数,供开发者在应用程序中调用,实现特定的功能。...

    数字图像处理 文档

    本资源针对初学者,以C#编程语言为基础,介绍如何使用C#中的Bitmap、BitmapData和Graphics等类来处理数字图像,并开发窗体应用程序。 首先,Bitmap是.NET Framework中的一个类,它代表了一个位图图像。你可以使用...

    C# WPF实现读取显示DICOM

    在本文中,我们将深入探讨如何使用C#和WPF(Windows Presentation Foundation)来实现读取并显示DICOM(Digital Imaging and Communications in Medicine)图像。DICOM是一种标准格式,广泛用于医疗影像领域,如CT...

    导出Flex组件为jpg图片

    1. **获取组件的渲染位图**:在Flex中,可以使用`flash.display.BitmapData`类的`draw()`方法来捕获组件的可视状态。你需要先确保组件已完全绘制,这可能需要触发一次重绘(例如通过改变大小或可见性)。 2. **位图...

    WPF利用WriteableBitmap处理图片流视频示例

    在Windows Presentation Foundation (WPF) 中,WriteableBitmap 是一个非常重要的类,它允许开发者将位图作为可写的像素数组来处理。这个类是用于直接操作图像像素,从而实现高效地处理图片和视频流。在本示例中,...

    C#图像处理_反色方式显示图像

    例如,Bitmap类用于表示位图图像,Graphics类提供了绘图操作的基本功能,Color结构则代表颜色信息。 1. **加载图像**: - 使用`Bitmap.FromFile()`方法从文件加载图像到Bitmap对象。 - 示例代码:`Bitmap ...

    用Flex写的照片旋转

    1. **使用BitmapData对象**:在ActionScript中,BitmapData对象用于表示位图数据,可以用来读取、修改和绘制图像,包括旋转图像。 2. **Matrix对象**:Matrix对象可以用于执行各种图形变换,如缩放、旋转和位移。在...

    flex 大头贴摄像简单实现

    在本文中,我们将深入探讨如何使用Adobe Flex技术来创建一个基本的大头贴摄像功能。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据绑定机制,...

    C# WPF 去除图片纯色背景

    创建一个WriteableBitmap对象,然后通过LockBits方法获取位图的BitmapData,从而可以直接访问每个像素的颜色信息。 2. **颜色比较和容差值:** 去除纯色背景的核心算法是颜色比较。我们需要遍历图像的每一个像素,...

    基于TextField的图文混编的组件

    插入图片可能需要利用BitmapData对象和嵌入位图字体,或者创建自定义的TextField子类来扩展功能。 3. **事件监听与交互**:添加事件监听器以响应用户的输入操作,如KeyboardEvent.KEY_DOWN用于捕捉键盘输入,...

Global site tag (gtag.js) - Google Analytics