效果图如下:

源码:
AirslakeImage.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);
            }
        });
    }
}

Java实现窗体中角色逐渐风化效果相关推荐

  1. java添加窗体中_java中利用JFrame创建窗体 【转】

    Java代码 publicclassTest(){ publicstaticvoidmain(String[] args){ JFrame frame = newJFrame(); JPanel pa ...

  2. access窗体中再制作查询窗体_如何给java窗体添加下拉菜单项,以选择游戏难度为例 - 攻向前端的小白...

    首先我们来介绍一下,以记事本为例,菜单栏中的[文件],[编辑]等全部叫一个菜单条:在Java中用JMenuBar表示: 菜单条中每一个具体的项叫做菜单,在Java中用JMenu表示: 菜单中的每一个项 ...

  3. Java 实训 使用弹出对话框设置主窗体中的文本字体

     实训要求: 编写一个主窗体,该窗体有"设置字体"按钮和一个文本区. 编写一个JDialog的子类; FontDialog,其中使用下拉列表显示全部 字体的名称,当选择下拉列表中某 ...

  4. Java中的实现马赛克效果以及灰度效果----整张图片

    ** Java中的实现马赛克效果以及灰度效果-----整张图片 ** 实现该效果的思路: 我们知道图片是由一个一个的像素组成的,比如一张图片的分辨率为800 * 800,则它是由800个像素 * 80 ...

  5. java 选择图片 显示不出来的_JAVA 窗体选择图片显示在窗体中

    package day01; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; p ...

  6. vb调用 java函数_VB中如何在窗体中调用模块的public函数?

    解决方案1: 则该变量只是在其所属工程中是公用的. 可以使用 Public 语句声明一个过程,Public NumberOfEmployees As Integer 也可以使用 Public 语句来声 ...

  7. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  8. 【JAVA】Java 内存模型中的 happen-before

    前言 Java 语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力,这既带来了强大.灵活的多线程机制,也带来了线程安全等令人混淆的问题,而 Java 内存模型(Java Memory M ...

  9. Java类似相机中图像处理(上)

    Java类似相机中图像处理(上) 一.前情提要 二.项目流程 \qquad 1. 创建窗体 \qquad 2. 动作监听器 \qquad 3. 获取图片文件像素值 \qquad 4. 画原画 \qqu ...

最新文章

  1. is null和is not null运算符
  2. python打印星星居中_python中怎么打印星星
  3. 美国顶尖大学的博士是怎样练成的?
  4. 【CSS】学习笔记1 使用CSS样式表
  5. log4j配置时的位置问题
  6. 如何“发现”失联多年好友?代码告诉你!
  7. web应用转化为saas多租户
  8. Python04,变量与赋值
  9. 软考中级软件设计师考试大纲
  10. 华为手机热点无法连接_为什么华为手机开热点别的手机连不上?
  11. AI房产户型图识别3DRender
  12. 当不知轴承型号时如何寻找轴承故障频率_电机轴承的故障诊断与失效分析
  13. vue 非父子组件传值
  14. 【Python】列表解析式
  15. Jenkins + Gitlab+ Docker + SpringBoot 构建流水线
  16. CCD摄像机主要技术参数解释
  17. Adam学习25之读取sam生成的alignmentRecord含recordGroupDictionary
  18. 大众点评Java开发实时应用监控平台-CAT
  19. 基于IntelliJ Idea的Scala开发demo一Spark开发demo
  20. 很抱歉,系统监测到你的支付宝账号有异常,入驻失败,如需帮助请拨打热线-------支付宝开放平台入驻失败如何解决???

热门文章

  1. 建立和验证一个临床分类系统(详细过程)
  2. 数控机床电气控制课程作业(三)
  3. java基于微信小程序的电影院购票选座 uniapp 小程序
  4. 跨境电商取得成功的三个可行性战略
  5. iptables tc限速笔记
  6. springMVC结合Shiro实现登录失败次数过多锁定账户功能
  7. 推特裁员戏剧性反转!“逗比”马斯克哭求被裁员工返回公司上班!
  8. 解题:八省联考2018 林克卡特树
  9. arduino——Arduino电容测量计
  10. nba球衣字体下载_球衣1.3版发布