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) 回复
为什么
回复评论