`

[转]BitmapData实现的透镜折射效果

阅读更多
http://bbs.9ria.com/viewthread.php?tid=80586&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000



package{
        import flash.display.MovieClip;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.utils.ByteArray;
        import flash.geom.Rectangle;
        import flash.geom.Point;
        import Math;    
        public class main extends MovieClip{
                const pictureWidth:int=1000;
                const pictureHeight:int=800;
                const lensWidth:int=100;
                var srcBmp:BitmapData=new picData(0,0);
                var srcArray:ByteArray=new ByteArray();
                var lensBmp:BitmapData=new BitmapData(lensWidth,lensWidth,true,0x00FFFF);
                var lensArray:ByteArray=new ByteArray();
                var lensData:Array=new Array();
                var rect:Rectangle=new Rectangle(0,0,pictureWidth,pictureWidth);
                var image:Bitmap=new Bitmap(lensBmp);
                public function main():void{
                        stage.addChild(image);
                        init();
                        srcArray=srcBmp.getPixels(rect);
                        rect.width=lensWidth;
                        rect.height=lensWidth;
                        stage.addEventListener(MouseEvent.MOUSE_MOVE,drawLens);
                        drawLens(new MouseEvent("MouseEvent.MOUSE_MOVE",true,true,100,100));
                }
                private function init(){
                        var jl:Number=0;
                        var centeroint=new Point(Number(lensWidth/2),Number(lensWidth/2));
                        var temp:Number=(lensWidth/2)*(lensWidth/2);
                        for (var i:Number=0;i<lensWidth;i++){
                                lensData.push(new Array());
                                for (var j:Number=0;j<lensWidth;j++){
                                        jl=Point.distance(center,new Point(i,j));
                                        if(jl*2<=lensWidth){
                                                lensData[j]=Math.sqrt(temp-jl*jl)*5;
                                        }else{
                                                lensData[j]=0;
                                        }
                                }
                        }
                }
                private function drawLens(event:MouseEvent):void{
                        var lx:int=int(event.localX*2)-50;
                        var ly:int=int(event.localY*2)-50;
                        var tx:int,ty:int;
                        
                        rect.x=event.localX*2-50;
                        rect.y=event.localY*2-50;
                        lensArray=new ByteArray();
                        for (var i:int=0;i<lensWidth-1;i++){
                                for (var j:int=0;j<lensWidth-1;j++){
                                        tx=(lensData[j]-lensData[i+1][j]);
                                        ty=(lensData[j]-lensData[j+1]);
                                        if (lx+i+tx<pictureWidth && lx+i+tx>0 && ly+j+ty<pictureHeight && ly+j+ty>0 && lensData[j]!=0){
                                                
                                                lensArray[converLens(i,j)]=srcArray[conver(lx+i+tx,ly+j+ty)];
                                                lensArray[converLens(i,j)+1]=srcArray[conver(lx+i+tx,ly+j+ty)+1];
                                                lensArray[converLens(i,j)+2]=srcArray[conver(lx+i+tx,ly+j+ty)+2];
                                                lensArray[converLens(i,j)+3]=srcArray[conver(lx+i+tx,ly+j+ty)+3];
                                        }
                                }
                        }
                        lensArray[converLens(lensWidth-1,lensWidth-1)+3]=0;
                        lensArray.position=0;
                        rect.x=0;
                        rect.y=0;
                        lensBmp.lock();
                        lensBmp.setPixels(rect,lensArray);
                        lensBmp.unlock();
                        image.x=event.localX-50;
                        image.y=event.localY-50;
                }
                private function conver(tx:int,ty:int):int{
                        return ty*pictureWidth*4+tx*4;
                }
                private function converLens(tx:int,ty:int):int{
                        return ty*lensWidth*4+tx*4;
                }
        }
}

分享到:
评论

相关推荐

    [转] BitmapData 基础部分2

    可以设置位图的混合模式,实现复杂的图像合成效果。 7. draw()方法: 该方法可以将DisplayObject绘制到BitmapData对象上,这在需要捕获舞台上的对象或者创建动态纹理时非常有用。 根据提供的文件名列表,我们...

    BitmapData.draw方法

    总的来说,BitmapData.draw方法是Flash开发中非常强大的工具,它可以灵活地处理显示对象,实现丰富的视觉效果和高效的性能优化。在实际开发中,根据具体需求,结合其他相关技术,如Matrix和ColorTransform,可以实现...

    ActionScript 3 BitmapData 的例子

    综上所述,BitmapData是ActionScript 3中一个强大而灵活的工具,它使开发者能够直接操作图像像素,从而实现各种复杂的视觉效果和图像处理功能。通过理解和实践这些示例,你将能够更好地掌握ActionScript 3中位图处理...

    使用C#的BitmapData

    在上述代码示例中,我们看到如何使用`BitmapData`来实现一个简单的位图像素转换功能,即将输入位图中的每个像素的RGB值取反并创建一个新的输出位图。首先,创建了一个新的`Bitmap`对象`bmpOut`,并定义了输入位图`m_...

    BitmapData.zip

    这些函数可以直接作用于 BitmapData 对象,以实现各种视觉效果或分析任务。例如,模糊处理可以用于降低图像细节,提高对比度则可以突出图像的边缘和特征。 4. **性能优化**: "很好用!!!" 这一描述暗示 ...

    位图噪声效果BitmapData类的运用

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

    翻转效果(ActionScript)

    要实现这样的效果,我们需要理解ActionScript中的关键概念和技术,包括: 1. **图形绘制和位图处理**:ActionScript提供了对矢量图形和位图的操作,如通过Graphics类进行绘制,以及使用BitmapData类进行像素级别的...

    BitmapData.pas和kbKernel.pas

    例如,用户可以先使用 BitmapData 找到游戏中特定的物品或角色,然后利用 kbKernel 触发相应的键盘操作,实现自动捡物或攻击。这种技术在游戏测试、数据分析、以及提高工作效率的场景中都有广泛的应用。 总之,...

    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...

    flex 360度旋转小人,模拟3D效果

    在本文中,我们将深入探讨如何使用Adobe Flex技术来创建一个360度旋转的小人模型,从而实现模拟3D效果的交互式应用。Flex是一种基于ActionScript 3.0的开源框架,它允许开发者构建富互联网应用程序(RIA),提供丰富...

    as3.0 翻转效果 翻牌效果

    我们将从基本概念开始,逐步解析实现这一效果所需的编程技巧。 1. **ActionScript 3.0基础** AS3.0是Adobe Flash平台的主要编程语言,用于创建富互联网应用程序(RIA)。它具有面向对象的特性,提高了性能和可维护...

    as3实现图片lomo效果

    ### AS3 实现图片 Lomo 效果详解 随着数字图像处理技术的发展,人们对于图像效果的需求也变得多样化。Lomo 效果以其独特的风格深受摄影爱好者和设计师的喜爱。本文将详细介绍如何使用 AS3(ActionScript 3)来实现...

    delphi 找图找色 BitmapData.pas

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

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

    源码分析可能是博主分享了一些实现特定效果的示例代码,比如用BitmapData制作像素级的动画或者模糊效果。这些示例可能涵盖了如何使用上述方法并结合循环进行像素操作,或者与其他Flash API结合,如Graphics和Bitmap...

    as3实现鱼眼效果

    在本文中,我们将深入探讨如何使用ActionScript 3(AS3)实现鱼眼效果,这是一种在数字图像处理中常见的视觉特效。鱼眼效果通常用于创建360度全景图像,模拟相机镜头产生的极端广角视图,使得图像边缘呈现出显著的...

    [转]image[转换效果]

    标题中的“[转]image[转换效果]”表明这篇内容可能是关于图像处理和转换技术的,特别是涉及到动画或视觉效果的。从标签“源码”和“工具”来看,我们可以推测这可能是一个开源项目或者一个实用的代码工具,用于图像...

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

    CopyPixel方法可以用于实现各种图像效果,比如像素复制、剪切、粘贴,甚至是复杂的图像混合和滤镜效果。在游戏开发中,这可以用于创建动画、碰撞检测、像素级的遮罩效果,或者在绘制复杂图形时提高性能。 例如,...

    VC++ 实现位图透明效果示例

    在VC++编程环境中,实现位图的透明效果是一项常见的任务,尤其在开发图形用户界面或者游戏时。位图透明度的处理使得图像可以与背景或者其他元素更好地融合,提供更美观的视觉体验。在这个示例中,我们将探讨如何使用...

    将Bitmap转成byte[]小例子

    以下是如何实现的示例: ```java public static Bitmap byteArrayToBitmap(byte[] byteArray) { if (byteArray == null || byteArray.length == 0) { return null; } ByteArrayInputStream ...

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

    2. `cropImage(Image src, Rectangle rect)`: 这个方法用于从源Image中裁剪出一个矩形区域,通过BitmapData的`setRectangle()`或`copyArea()`方法实现。 3. `adjustBrightnessContrast(Image src, int brightness, ...

Global site tag (gtag.js) - Google Analytics