利用Swing的Api实现镜面效果
2012-06-11 18:34
363 查看
可以使用算法实现镜面等各种效果,但也可以简单的通过使用Swing提供的方法实现一些特殊效果。
Swing自带了12种Composite,合理利用还是挺不错的.
源图像:
镜面效果:
Swing自带了12种Composite,合理利用还是挺不错的.
源图像:
镜面效果:
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class ReflectedImage extends JPanel { private BufferedImage img; public ReflectedImage() { img = loadImage("apple.png"); img = createReflectedImage(img); setBackground(Color.BLACK); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g2d.drawImage(img, 30, 30, null); } // 因为Swing的back-buffer是不透明的,所以要自己创建一个透明图片来处理反射 public static BufferedImage createReflectedImage(BufferedImage img) { int w = img.getWidth(); int h = img.getHeight(); BufferedImage reflect = new BufferedImage(w, h * 2, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = reflect.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); // 绘制原图像 g2.drawImage(img, 0, 0, null); // 绘制镜面图像 g2.translate(0, h + 1); g2.drawImage(img, 0, 0, w, (int) (h / 1.5), 0, h, w, 0, null); // 绘制透明的渐变 g2.setPaint(new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.9f), 0, (int) (h / 2), new Color(1.0f, 1.0f, 1.0f, 0.0f))); // 关键就在DstIn,只使用源图像的透明度,目标图像不透明的地方继续不透明: // Ar = Ad * As // Cr = Cd * As g2.setComposite(AlphaComposite.DstIn); g2.fillRect(0, 0, w, h); g2.dispose(); return reflect; } // 读取图片 public static BufferedImage loadImage(String path) { try { return ImageIO.read(new File(path)); } catch (Exception e) { e.printStackTrace(); } return null; } private static void createGuiAndShow() { JFrame frame = new JFrame("Reflected Image"); frame.getContentPane().add(new ReflectedImage()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 520); frame.setLocationRelativeTo(null); frame.setAlwaysOnTop(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createGuiAndShow(); } }); } }
相关文章推荐
- 利用Animatewindow API实现窗口动画效果
- 利用jwplayer的API实现播放定时弹出框效果
- IOS之左右滑动效果的实现——利用SWRevealViewController
- Linux-(C)利用Mysql相关API实现类似mysql的操作
- 避开Google Voice Search利用Google Speech API实现Android语音识别之原理
- 利用Scroller实现防QQ列表侧滑效果
- Linux下,利用FreeType2的API实现字符的显示
- Android 利用popwindow实现类似下拉框效果
- 颠倒黑白 (Inverse) ——利用 .NET Framework 实现图像反色效果小记
- 利用UIBezierPath实现的橡皮筋动画效果(OC版)
- 基于Swing 实现放大镜效果
- python利用新浪API实现数据的抓取\python微博数据爬虫
- 利用transition实现文字上下抖动的效果
- 利用TitleWindow和VideoPlayer组件轻松实现视频弹出播放效果
- 利用GestureDetector快速实现页面切换滑动效果
- Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
- 利用Radiogroup Radiobutton 实现滑动效果菜单
- 利用javascript从数据库取数据来实现CSDN首页图片的切换效果(新增下载地址)
- 利用系统api实现数据库的增删改查 →数据库的增删改查
- 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能