[java]代码库
package org.test;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.PixelGrabber;
import java.util.Random;
import org.loon.framework.game.image.Bitmap;
import org.loon.framework.game.image.LColor;
/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:java实现图片风化效果
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class AirslakeImage extends Panel implements Runnable, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
static final public int _WIDTH = 400;
static final public int _HEIGHT = 400;
private boolean _isRun = false;
private Image _img;
private Image _screen;
private Graphics _back;
private int _imgWidth;
private int _imgHeight;
private Fraction[] _fractions;
private Thread _timer;
private Button _meganteButton;
private Button _revivalButton;
private Random _rand = new Random();
public AirslakeImage() {
_screen = new Bitmap(_WIDTH, _HEIGHT).getImage();
_back = _screen.getGraphics();
setSize(_WIDTH, _HEIGHT);
_meganteButton = new Button("破碎图片");
_meganteButton.addActionListener(this);
add(_meganteButton);
_revivalButton = new Button("还原图片");
_revivalButton.addActionListener(this);
add(_revivalButton);
_revivalButton.setEnabled(false);
loadImage("role.png");
init(_img);
}
/**
* 初始化image图像,分解其中像素
*
* @param _img
*/
private void init(Image _img) {
if (_timer != null) {
_timer = null;
_isRun = false;
}
_fractions = new Fraction[_imgWidth * _imgHeight];
PixelGrabber pg = new PixelGrabber(_img, 0, 0, _imgWidth, _imgHeight,
true);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}
int pixel[] = (int[]) pg.getPixels();
// 重新封装像素
for (int y = 0; y < _imgHeight; y++) {
for (int x = 0; x < _imgWidth; x++) {
int n = y * _imgWidth + x;
_fractions[n] = new Fraction();
double angle = _rand.nextInt(360);
double speed = 10.0 / _rand.nextInt(30);
_fractions[n].x = x + 90;
_fractions[n].y = y + 20;
_fractions[n].vx = Math.cos(angle * Math.PI / 180) * speed;
_fractions[n].vy = Math.sin(angle * Math.PI / 180) * speed;
_fractions[n].color = pixel[n];
_fractions[n].countToCrush = x / 6 + _rand.nextInt(10);
}
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
// 变更背景色
_back.setColor(Color.WHITE);
// 清空背景
_back.fillRect(0, 0, _WIDTH, _HEIGHT);
for (int n = 0; n < _imgWidth * _imgHeight; n++) {
int x = (int) _fractions[n].x;
int y = (int) _fractions[n].y;
LColor color = LColor.getLColor(_fractions[n].color);
// 纯黑色区域不读取
if (!LColor.equals(color, LColor.fromArgb(0, 0, 0))) {
// 获得rgb三色
int red = color.R;
int green = color.G;
int blue = color.B;
_back.setColor(new Color(red, green, blue));
// 绘制
_back.drawLine(x, y, x, y);
}
}
g.drawImage(_screen, 0, 0, this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == _meganteButton) {
execute();
_meganteButton.setEnabled(false);
_revivalButton.setEnabled(true);
} else if (e.getSource() == _revivalButton) {
init(_img);
repaint();
_meganteButton.setEnabled(true);
_revivalButton.setEnabled(false);
}
}
/**
* 加载图像
*
* @param filename
*/
private void loadImage(String filename) {
Bitmap bitmap = new Bitmap(("./image/" + filename).intern());
// 替换透明区域颜色(象素化后,转为rgb形式的透明区域色值将显示为r=0,g=0,b=0),可以直接用pixel识别透明区域,也可以替换或跳过该区域)
_img = bitmap.getImage();
_imgWidth = _img.getWidth(this);
_imgHeight = _img.getHeight(this);
}
/**
* 执行操作
*
*/
private void execute() {
_timer = new Thread(this);
_timer.start();
_isRun = true;
}
class Fraction {
// 图片在窗体中x
public double x;
// 图片在窗体中y
public double y;
// 显示图x
public double vx;
// 显示图y
public double vy;
// color
public int color;
// 变形颗粒数量
public int countToCrush;
}
public void run() {
while (_isRun) {
for (int n = 0; n < _imgWidth * _imgHeight; n++) {
if (_fractions[n].countToCrush <= 0) {
_fractions[n].x += _fractions[n].vx;
_fractions[n].y += _fractions[n].vy;
_fractions[n].vy += 0.1;
} else {
_fractions[n].countToCrush--;
}
}
// 间隔
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Frame frm = new Frame("java实现图片风化效果");
frm.add(new AirslakeImage());
frm.setResizable(false);
frm.setSize(_WIDTH, _HEIGHT);
frm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
});
}
}
[代码运行效果截图]
初级程序员
by: 十四号格仔 发表于:2014-06-17 12:44:33 顶(0) | 踩(0) 回复
为什么
回复评论