Java图形程序水纹倒映效果

效果图如下:


package org.test;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Panel;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;

import org.loon.framework.game.helper.ImageHelper;

/***/ /**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:Java图形程序水纹倒映效果
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

public class ImageWave extends Panel implements Runnable ... {

/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

privateThreadthread;

privateImage_image;

privateMediaTracker_mt;

privateint_delay;

privateGraphics_bg;

privateImage_screen;

privateboolean_playing;

privateint_pixels[];

privateint_mpixels[];

privateint_wpixels[];

privatefinalstaticint_WIDTH=480;

privatefinalstaticint_HEIGHT=604;

privateImage_images[];

privateint_sleep;

privateint_frame;

/***//**
*构造函数,注入背景图与延迟时间
*
*
@paramimg
*
@paramdelay
*/

publicImageWave(Imageimg,intdelay)...{
_delay
=delay;

init(img,delay);

}


publicvoidinit(Imageimg,intdelay)...{
setBackground(Color.BLACK);
_image
=img;
_mt
=newMediaTracker(this);
_mt.addImage(_image,
0);
_mt.checkAll(
true);
_frame
=10;
_screen
=newBufferedImage(_WIDTH,_HEIGHT,1);
_bg
=_screen.getGraphics();
thread
=newThread(this);
thread.start();
}


publicvoidrun()...{
Thread.currentThread().setPriority(
1);
longl=System.currentTimeMillis();
while(Thread.currentThread()==thread)
try...{
repaint();
_sleep
++;
l
+=_delay;
Thread.sleep(Math.max(
0L,l-System.currentTimeMillis()));
}
catch(InterruptedException_ex)...{
return;
}

}


/***//**
*绘制图象
*/

publicvoidpaint(Graphicsg)...{

if(!_playing)...{
if(_mt.checkAll())...{
_playing
=true;
_bg.drawImage(_image,
0,0,this);
_pixels
=newint[(_WIDTH*_HEIGHT)/2];
_mpixels
=newint[(_WIDTH*_HEIGHT)/2];
_wpixels
=newint[((_WIDTH*_HEIGHT)/2)*_frame];
PixelGrabberpixelgrabber
=newPixelGrabber(_image,0,0,
_WIDTH,_HEIGHT
/2,_pixels,0,_WIDTH);
try...{
pixelgrabber.grabPixels();
}
catch(InterruptedException_ex)...{
}

blure();
_images
=newImage[_frame];
for(inti=0;i<_frame;i++)
_images[i]
=createMirrorImage(i);

}

}
else...{
if(_sleep>_frame-1)
_sleep
=0;
_bg.drawImage(_images[_sleep],
0,_HEIGHT/2,this);
}

g.drawImage(_screen,
0,0,this);
}


publicvoidupdate(Graphicsg)...{
paint(g);
}


/***//**
*创建波纹反射图片
*
*
@parami
*
@return
*/

ImagecreateMirrorImage(
inti)...{
intk1=_HEIGHT/2;
intj1=i*_WIDTH*k1;
for(intk=0;k<k1;k++)...{
intl=k*_WIDTH;
inti1=k1-k-1;
i1
+=(int)((double)((k*5)/k1+2)*Math
.sin((
25.132741228718345D*(double)i1*(double)i1)
/(double)k1/(double)k1
-(6.2831853071795862D*(double)i)
/(double)_frame));
if(i1<0)
i1
=0;
if(i1>k1-1)
i1
=k1-1;
i1
*=_WIDTH;
for(intj=0;j<_WIDTH;j++)
_wpixels[j1
+j+l]=_mpixels[j+i1];

}


Imageimage
=createImage(newMemoryImageSource(_WIDTH,k1,_wpixels,
j1,_WIDTH));
returnimage;
}


/***//**
*模糊化反射图片
*
*/

voidblure()...{
intl=_HEIGHT/2;
for(intj=0;j<l;j++)...{
intk=j*_WIDTH;
for(inti=0;i<_WIDTH;i++)...{
inti1=_pixels[i+k];
intj1;
if(i!=_WIDTH-1)
j1
=_pixels[i+k+1];
else
j1
=_pixels[(i+k)-1];
intk1=0;
if(j!=l-1)
k1
=_pixels[i+k+_WIDTH];
else
k1
=_pixels[(i+k)-_WIDTH];
intl1=0;
if(j!=l-1&&i!=_WIDTH-1)
l1
=_pixels[i+k+_WIDTH+1];
else
l1
=_pixels[i+k];
inti2=(i1>>16&0xff)+(j1>>16&0xff)
+(k1>>16&0xff)+(l1>>16&0xff);
intj2=(i1>>8&0xff)+(j1>>8&0xff)+(k1>>8&0xff)
+(l1>>8&0xff);
intk2=(i1&0xff)+(j1&0xff)+(k1&0xff)+(l1&0xff);
i2
>>=3;
j2
=(j2>>3)+(j2>>4);
k2
=(k2>>3)+(k2>>4);
_mpixels[i
+k]=i1&0xff000000|i2<<16|j2<<8|k2;
}


}


}


publicstaticvoidmain(String[]args)...{
Framefrm
=newFrame();
frm.setTitle(
"Java图形程序水纹倒映效果(由Loonframework提供)");
frm.setSize(_WIDTH,_HEIGHT
+20);
frm.setResizable(
false);
frm.add(
newImageWave(ImageHelper.loadImage("C:/back.jpg",true),100));
frm.setVisible(
true);
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值