现在的位置: 首页 > 综合 > 正文

经典代码收藏之——模糊特效

2018年01月30日 ⁄ 综合 ⁄ 共 2110字 ⁄ 字号 评论关闭

     每个Swing 组件的绘制 都是通过paintComponent( ) 方法来实现的,通过重写该方法可以实现许多有趣的特效。模糊特效的实现是在象素级别进行操作的。是逐象素进行模糊的。先将你欲模糊的图片转化为内存中的位图表示,然后模糊每个象素。下面的BufferedImage 即是将图片存储为一个内存块,每个象素占3字节(四字节每象素表示里有一个字节表示alpha通道——就是灰度级
;其余三字节,每字节表示红 绿 蓝 即RGB),模糊特效不需要alpha通道。java2D提供了许多对象素级处理图象的方法如下面的ConvolveOp 它需要一个Kernel 对象作为参数,Kernel对象的构造需要提供一个3*3矩阵,该矩阵将会作用到每个象素上,相关矩阵的意义可在任何一本计算机图形学书籍上找到。

package swingTest;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.awt.event.*;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class BlurJButton extends JButton {

public BlurJButton() {
    // TODO Auto-generated constructor stub
}

public BlurJButton(Icon arg0) {
    super(arg0);
    // TODO Auto-generated constructor stub
}

public BlurJButton(String arg0) {
    super(arg0);
    // TODO Auto-generated constructor stub
}

public BlurJButton(Action arg0) {
    super(arg0);
    // TODO Auto-generated constructor stub
}

public BlurJButton(String arg0, Icon arg1) {
    super(arg0, arg1);
    // TODO Auto-generated constructor stub
}

public void paintComponent(Graphics g) {
    if(isEnabled()) {
    super.paintComponent(g);
    return;
    }
  
    BufferedImage buf = new BufferedImage(getWidth(),getHeight(),
      BufferedImage.TYPE_INT_RGB);        
    super.paintComponent(buf.getGraphics());
    // Blur the buffered image (see next section)
    float[] my_kernel = {
      0.10f, 0.10f, 0.10f,
      0.10f, 0.20f, 0.10f,
      0.10f, 0.10f, 0.10f };
     ConvolveOp op = new ConvolveOp(new Kernel(3,3, my_kernel));
     Image img = op.filter(buf,null);
     g.drawImage(img,0,0,null);

}

/**
    * @param args
    */
public static void main(String[] args) {
  
    // TODO Auto-generated method stub
  
    JFrame frame = new JFrame("Blurred Button Hack");
    final JButton button = new BlurJButton("A Blurred Button");
    JButton control = new JButton("Switch");
    control.addActionListener(new ActionListener() {
  
     public void actionPerformed(ActionEvent evt) {
     button.setEnabled(!button.isEnabled());
     }
    });

    frame.getContentPane().add(button);
    frame.getContentPane().add("South",control);
    frame.pack();
    frame.setVisible(true);

}

}

抱歉!评论已关闭.