📄 imageproc.java
字号:
/**
* Title: Java水中倒影演示程序
* Description: Java水中倒影演示程序,用于北京师范大学计算机系Java课程教学示范。
* Copyright: Copyright (c) 2001
* Company: 北京师范大学计算机系
* @author 孙一林
* @version 1.0
*/
import java.applet.Applet;
import java.awt.*;
public class ImageProc extends Applet
implements Runnable
{
Image originalRipplePicture;
Image originalLakePicture;
Image ripplePicture;
Image lakePicture;
boolean doneProcessing;
int whichEffect;
int frames;
int currentFrame;
int imageWidth;
int imageHeight;
int lakeHeight;
Thread m_ImageProc2;
private String m_picture1;
private String m_picture2;
private final String PARAM_picture1 = "picture1";
private final String PARAM_picture2 = "picture2";
public ImageProc()
{
m_ImageProc2 = null;
m_picture1 = "";
m_picture2 = "";
doneProcessing = false;
whichEffect = 1;
currentFrame = 0;
frames = 12;
}
public void destroy()
{
}
public void init()
{
String s = getParameter("picture1");
if(s != null)
m_picture1 = s;
s = getParameter("picture2");
if(s != null)
m_picture2 = s;
resize(260, 260);
MediaTracker mediatracker = new MediaTracker(this);
originalRipplePicture = getImage(getCodeBase(), m_picture1);
mediatracker.addImage(originalRipplePicture, 0);
try
{
mediatracker.waitForID(0);
}
catch(InterruptedException _ex) { }
originalLakePicture = getImage(getCodeBase(), m_picture2);
mediatracker.addImage(originalLakePicture, 1);
try
{
mediatracker.waitForID(1);
}
catch(InterruptedException _ex) { }
imageWidth = originalRipplePicture.getWidth(this);
imageHeight = originalRipplePicture.getHeight(this);
lakeHeight = originalLakePicture.getHeight(this);
ripplePicture = createImage(imageWidth, imageHeight * frames);
lakePicture = createImage((frames + 1) * imageWidth, imageHeight);
processImages();
showStatus("");
doneProcessing = true;
}
public void makeWaves(Graphics g, int i, int j, int k, int l)
{
double d = (6.2831853071795862D * (double)i) / (double)j;
for(int k1 = 0; k1 < l; k1++)
{
int j1 = (int)((8D * ((double)k1 + (double)l / 5D) * Math.sin((double)(10 * (l - k1)) / (double)(k1 + 1) + d)) / (double)l);
int i1 = (j - i) * k;
if(k1 < -j1)
g.copyArea(j * k, k1, k, 1, -i1, 0);
else
g.copyArea(j * k, k1 + j1, k, 1, -i1, -j1);
}
}
public boolean mouseDown(Event event, int i, int j)
{
whichEffect ^= 0x1;
currentFrame = 0;
return true;
}
public void paint(Graphics g)
{
if(doneProcessing)
{
g.setColor(Color.white);
if(whichEffect == 0)
{
g.drawImage(ripplePicture, 0, -(currentFrame * imageHeight), this);
g.drawImage(ripplePicture, 0, (frames - currentFrame) * imageHeight, this);
} else
{
g.drawImage(lakePicture, -(currentFrame * imageWidth), lakeHeight, this);
g.drawImage(lakePicture, (frames - currentFrame) * imageWidth, lakeHeight, this);
g.drawImage(originalLakePicture, 0, 0, this);
}
}
}
public void processImages()
{
Image image = createImage(imageWidth, imageHeight);
Graphics g = image.getGraphics();
Graphics g1 = ripplePicture.getGraphics();
for(int i = 0; i < frames; i++)
{
g.drawImage(originalRipplePicture, 0, 0, this);
rotateImage(g, frames, i, 25, imageWidth, imageHeight);
g1.drawImage(image, 0, imageHeight * i, this);
}
image = createImage(imageWidth, lakeHeight + 1);
g = image.getGraphics();
g1 = lakePicture.getGraphics();
g.drawImage(originalLakePicture, 0, 0, this);
for(int k = 0; k < lakeHeight >> 1; k++)
{
g.copyArea(0, k, imageWidth, 1, 0, lakeHeight - k);
g.copyArea(0, lakeHeight - 1 - k, imageWidth, 1, 0, -lakeHeight + 1 + (k << 1));
g.copyArea(0, lakeHeight, imageWidth, 1, 0, -1 - k);
}
g1.drawImage(image, frames * imageWidth, 0, this);
for(int j = 0; j < frames; j++)
makeWaves(g1, j, frames, imageWidth, lakeHeight);
}
public void rotateImage(Graphics g, int i, int j, int k, int l, int i1)
{
shearX(g, i, j, k, l, i1);
shearY(g, i, j, k, l, i1);
}
public void run()
{
do
try
{
currentFrame++;
if(currentFrame > frames)
currentFrame = 0;
Graphics g = getGraphics();
paint(g);
Thread.sleep(50L);
}
catch(InterruptedException _ex)
{
stop();
}
while(true);
}
public void shearX(Graphics g, int i, int j, int k, int l, int i1)
{
for(int j1 = 0; j1 < i1; j1++)
{
double d = (double)(k >> 1) * Math.sin((double)j1 / (double)k + (6.2831853071795862D * (double)j) / (double)i);
g.copyArea(0, j1, l, 1, (int)d, 0);
}
}
public void shearY(Graphics g, int i, int j, int k, int l, int i1)
{
for(int j1 = 0; j1 < l; j1++)
{
double d = (double)(k >> 1) * Math.sin((double)j1 / (double)k + (6.2831853071795862D * (double)j) / (double)i);
g.copyArea(j1, 0, 1, i1, 0, (int)d);
}
}
public void start()
{
if(m_ImageProc2 == null)
{
m_ImageProc2 = new Thread(this);
m_ImageProc2.start();
}
}
public void stop()
{
if(m_ImageProc2 != null)
{
m_ImageProc2.stop();
m_ImageProc2 = null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -