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

[url]http://bbs.9ria.com/viewthread.php?tid=80586&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000[/url]



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;
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,SDK是指软件开发工具包,其中包含了一些开发所需的文件和工具,而BitmapData是一种用于处理位图数据的API,可以用来对图像进行读取、编辑、绘制等操作。而HIMG则是一种格式,它是可压缩的、高质量的图片格式,具有较小的文件大小和较好的图像质量。 将SDK中的BitmapData换成HIMG格式需要一定的技术和步骤。一般而言,需要使用第三方库或工具对BitmapData进行换。其中,常用的工具有ImageMagick、Photoshop、GraphicsMagick等。这些工具都提供了丰富的API和功能,可以对BitmapData进行灵活高效的换。使用这些工具BitmapData时,需要注意几个方面: 1. 根据需求选择不同的换工具和参数。不同的工具和参数会产生不同的效果和结果。 2. 对图像进行优化和压缩,以达到最佳的图像质量和文件大小。 3. 注意保持图像的分辨率和比例,以确保图像的完整性和准确性。 总之,BitmapData换成HIMG需要使用第三方库或工具,选择合适的工具和参数,并注意保持图像的分辨率和比例。这样可以获得高质量、高效的图像换结果。 ### 回答2: SDK是一种广泛使用的软件开发工具包,它提供了许多开发应用程序所需的功能和工具。其中BitmapData是一种接口,它提供了对位图像素数据的访问和操作。而HIMG则是一种图像文件格式,通常用于在移动设备中显示图像。 将BitmapData换为HIMG是一个比较常见的处理方式。可以通过SDK中提供的函数和方法实现换。具体的换流程如下: 首先,需要创建一个BitmapData对象,并使用其内置函数加载一张位图图像。然后,可以使用BitmapData对象提供的函数获取图像的宽度和高度等信息,并创建一个新的HIMG对象。 接下来,需要逐个访问BitmapData中每个像素的RGB值,并将其编码为HIMG格式。可以使用SDK中的一些方法和工具来完成这一步骤。最后,将编码后的HIMG保存到文件中,即可完成BitmapData到HIMG的换。 总之,通过SDK中提供的BitmapData接口和HIMG格式换工具,可以轻松地将BitmapData对象换为HIMG格式,实现图片的高效处理和存储。 ### 回答3: SDK开发中常常会涉及到图片的问题,而bitmapdata和himg是两种不同的图片格式。那么如何将bitmapdata换为himg呢? 首先需要了解两种图片格式的定义: bitmapdata:是AS3编程语言中的一个类,它可以创建和操作一个位图对象。该对象包含了像素数据(像素颜色和alpha通道值),可以进行像素级别的操作,如获取像素值,修改像素值等。 himg:是一种纯黑白的图片格式,可以用于一些低分辨率的显示屏幕上,比如一些LED屏幕。它的编程方式与bitmapdata完全不同,需要单独调用API进行操作。 下面介绍将bitmapdata换为himg的具体方法: 1. 首先需要将bitmapdata对象中的像素数据提取出来,可以使用getPixel方法,该方法返回一个uint类型的像素值。 2. 将得到的像素值化为himg格式。himg格式是一个单色的8位位图,因此需要将得到的像素值与0xff进行按位与操作,即:himgData = 0xff & pixelData; 3. 将每个像素点化为himg格式后,需要将所有的像素数据从左到右、从上到下地按字节存入一个字节数组中,即每8个像素点存为一个字节,最终得到一个himg格式的字节数组。 以上是将bitmapdata换为himg的具体方法,需要注意的是,himg格式不能够直接在屏幕上显示,需要使用专门的API进行显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值