Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 276|回复: 0

[Swing学习]Java图形水纹倒映效果

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 23:55:41 | 显示全部楼层 |阅读模式


      
      
      

    1. 程序:
    2. import java.awt.Color;
    3. import java.awt.Frame;
    4. import java.awt.Graphics;
    5. import java.awt.Image;
    6. import java.awt.MediaTracker;
    7. import java.awt.Panel;
    8. import java.awt.image.BufferedImage;
    9. import java.awt.image.MemoryImageSource;
    10. import java.awt.image.PixelGrabber;
    11. import javax.imageio.ImageIO;
    12. import java.io.File;
    13. import java.awt.Toolkit;

    14. /** *
    15. //**
    16. *  * Title: LoonFramework
    17. *
    18. *
    19. * Description:Java图形程序水纹倒映效果
    20. *
    21. *
    22. * Copyright: Copyright (c) 2007
    23. *
    24. *
    25. * Company: LoonFramework
    26. *
    27. *
    28. * @author chenpeng
    29. * @email:ceponline@yahoo.com.cn
    30. * @version 0.1
    31. */
    32. public class ImageWave extends Panel implements Runnable {
    33.     /** *//**
    34.      *
    35.      */
    36.     private static final long serialVersionUID = 1L;
    37.     private Thread thread;
    38.     private Image _image;
    39.     private MediaTracker _mt;
    40.     private int _delay;
    41.     private Graphics _bg;
    42.     private Image _screen;
    43.     private boolean _playing;
    44.     private int _pixels[];
    45.     private int _mpixels[];
    46.     private int _wpixels[];
    47.     private final static int _WIDTH = 300;
    48.     private final static int _HEIGHT = 378;
    49.     private Image _images[];
    50.     private int _sleep;
    51.     private int _frame;
    52.     /** *//**
    53.      * 构造函数,注入背景图与延迟时间
    54.      *
    55.      * @param img
    56.      * @param delay
    57.      */
    58.     public ImageWave(Image img, int delay) {
    59.         _delay = delay;
    60.         init(img, delay);
    61.     }
    62.     public void init(Image img, int delay) {
    63.         setBackground(Color.BLACK);
    64.         _image = img;
    65.         _mt = new MediaTracker(this);
    66.         _mt.addImage(_image, 0);
    67.         _mt.checkAll(true);
    68.         _frame = 10;
    69.         _screen = new BufferedImage(_WIDTH, _HEIGHT, 1);
    70.         _bg = _screen.getGraphics();
    71.         thread = new Thread(this);
    72.         thread.start();
    73.     }
    74.     public void run() {
    75.         Thread.currentThread().setPriority(1);
    76.         long l = System.currentTimeMillis();
    77.         while (Thread.currentThread() == thread)
    78.             try {
    79.                 repaint();
    80.                 _sleep++;
    81.                 l += _delay;
    82.                 Thread.sleep(Math.max(0L, l - System.currentTimeMillis()));
    83.             } catch (InterruptedException _ex) {
    84.                 return;
    85.             }
    86.     }
    87.     /** *//**
    88.      * 绘制图象
    89.      */
    90.     public void paint(Graphics g) {
    91.         if (!_playing) {
    92.             if (_mt.checkAll()) {
    93.                 _playing = true;
    94.                 _bg.drawImage(_image, 0, 0, this);
    95.                 _pixels = new int[(_WIDTH * _HEIGHT) / 2];
    96.                 _mpixels = new int[(_WIDTH * _HEIGHT) / 2];
    97.                 _wpixels = new int[((_WIDTH * _HEIGHT) / 2) * _frame];
    98.                 PixelGrabber pixelgrabber = new PixelGrabber(_image, 0, 0,
    99.                         _WIDTH, _HEIGHT / 2, _pixels, 0, _WIDTH);
    100.                 try {
    101.                     pixelgrabber.grabPixels();
    102.                 } catch (InterruptedException _ex) {
    103.                 }
    104.                 blure();
    105.                 _images = new Image[_frame];
    106.                 for (int i = 0; i < _frame; i++)
    107.                     _images[i] = createMirrorImage(i);
    108.             }
    109.         } else {
    110.             if (_sleep > _frame - 1)
    111.                 _sleep = 0;
    112.             _bg.drawImage(_images[_sleep], 0, _HEIGHT / 2, this);
    113.         }
    114.         g.drawImage(_screen, 0, 0, this);
    115.     }
    116.     public void update(Graphics g) {
    117.         paint(g);
    118.     }
    119.     /** *//**
    120.      * 创建波纹反射图片
    121.      *
    122.      * @param i
    123.      * @return
    124.      */
    125.     Image createMirrorImage(int i) {
    126.         int k1 = _HEIGHT / 2;
    127.         int j1 = i * _WIDTH * k1;
    128.         for (int k = 0; k < k1; k++) {
    129.             int l = k * _WIDTH;
    130.             int i1 = k1 - k - 1;
    131.             i1 += (int) ((double) ((k * 5) / k1 + 2) * Math
    132.                     .sin((25.132741228718345D * (double) i1 * (double) i1)
    133.                             / (double) k1 / (double) k1
    134.                             - (6.2831853071795862D * (double) i)
    135.                             / (double) _frame));
    136.             if (i1 < 0)
    137.                 i1 = 0;
    138.             if (i1 > k1 - 1)
    139.                 i1 = k1 - 1;
    140.             i1 *= _WIDTH;
    141.             for (int j = 0; j < _WIDTH; j++)
    142.                 _wpixels[j1 + j + l] = _mpixels[j + i1];
    143.         }
    144.         Image image = createImage(new MemoryImageSource(_WIDTH, k1, _wpixels,
    145.                 j1, _WIDTH));
    146.         return image;
    147.     }
    148.     /** *//**
    149.      * 模糊化反射图片
    150.      *
    151.      */
    152.     void blure() {
    153.         int l = _HEIGHT / 2;
    154.         for (int j = 0; j < l; j++) {
    155.             int k = j * _WIDTH;
    156.             for (int i = 0; i < _WIDTH; i++) {
    157.                 int i1 = _pixels[i + k];
    158.                 int j1;
    159.                 if (i != _WIDTH - 1)
    160.                     j1 = _pixels[i + k + 1];
    161.                 else
    162.                     j1 = _pixels[(i + k) - 1];
    163.                 int k1 = 0;
    164.                 if (j != l - 1)
    165.                     k1 = _pixels[i + k + _WIDTH];
    166.                 else
    167.                     k1 = _pixels[(i + k) - _WIDTH];
    168.                 int l1 = 0;
    169.                 if (j != l - 1 && i != _WIDTH - 1)
    170.                     l1 = _pixels[i + k + _WIDTH + 1];
    171.                 else
    172.                     l1 = _pixels[i + k];
    173.                 int i2 = (i1 >> 16 & 0xff) + (j1 >> 16 & 0xff)
    174.                         + (k1 >> 16 & 0xff) + (l1 >> 16 & 0xff);
    175.                 int j2 = (i1 >> 8 & 0xff) + (j1 >> 8 & 0xff) + (k1 >> 8 & 0xff)
    176.                         + (l1 >> 8 & 0xff);
    177.                 int k2 = (i1 & 0xff) + (j1 & 0xff) + (k1 & 0xff) + (l1 & 0xff);
    178.                 i2 >>= 3;
    179.                 j2 = (j2 >> 3) + (j2 >> 4);
    180.                 k2 = (k2 >> 3) + (k2 >> 4);
    181.                 _mpixels[i + k] = i1 & 0xff000000 | i2 << 16 | j2 << 8 | k2;
    182.             }
    183.         }
    184.     }
    185.     public static void main(String[] args) {
    186.         Frame frm = new Frame();
    187.         frm.setTitle("Java图形程序水纹倒映效果(由Loonframework提供)");
    188.         frm.setSize(_WIDTH, _HEIGHT + 20);
    189.         frm.setResizable(false);
    190.         Image im=Toolkit.getDefaultToolkit().createImage("back.jpg");
    191.         frm.add(new ImageWave(im, 100));
    192.         frm.setVisible(true);
    193.     }
    194. }
    复制代码


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/2/235541140.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:09 , Processed in 0.297315 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表