Java tutorial
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.RenderingHints; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.net.URL; import javax.swing.JApplet; import javax.swing.JFrame; public class ClipImage extends JApplet implements Runnable { private Image img; private final double OINC[] = { 5.0, 3.0 }; private final double SINC[] = { 5.0, 5.0 }; private double x, y; private double ix = OINC[0]; private double iy = OINC[1]; private double iw = SINC[0]; private double ih = SINC[1]; private double ew, eh; // ellipse width & height private GeneralPath p = new GeneralPath(); private AffineTransform at = new AffineTransform(); private BasicStroke bs = new BasicStroke(20.0f); private Arc2D arc = new Arc2D.Float(); private Ellipse2D ellipse = new Ellipse2D.Float(); private RoundRectangle2D roundRect = new RoundRectangle2D.Float(); private Rectangle2D rect = new Rectangle2D.Float(); private Color redBlend = new Color(255, 0, 0, 120); private Color greenBlend = new Color(0, 255, 0, 120); private Thread thread; private BufferedImage offImg; private int w, h; private boolean newBufferedImage; public void init() { img = getImage(getURL("largeJava2sLogo.GIF")); try { MediaTracker tracker = new MediaTracker(this); tracker.addImage(img, 0); tracker.waitForID(0); } catch (Exception e) { } } public void drawDemo(Graphics2D g2) { if (newBufferedImage) { x = Math.random() * w; y = Math.random() * h; ew = (Math.random() * w) / 2; eh = (Math.random() * h) / 2; } x += ix; y += iy; ew += iw; eh += ih; if (ew > w / 2) { ew = w / 2; iw = Math.random() * -w / 16 - 1; } if (ew < w / 8) { ew = w / 8; iw = Math.random() * w / 16 + 1; } if (eh > h / 2) { eh = h / 2; ih = Math.random() * -h / 16 - 1; } if (eh < h / 8) { eh = h / 8; ih = Math.random() * h / 16 + 1; } if ((x + ew) > w) { x = (w - ew) - 1; ix = Math.random() * -w / 32 - 1; } if (x < 0) { x = 2; ix = Math.random() * w / 32 + 1; } if ((y + eh) > h) { y = (h - eh) - 2; iy = Math.random() * -h / 32 - 1; } if (y < 0) { y = 2; iy = Math.random() * h / 32 + 1; } ellipse.setFrame(x, y, ew, eh); g2.setClip(ellipse); rect.setRect(x + 5, y + 5, ew - 10, eh - 10); g2.clip(rect); g2.drawImage(img, 0, 0, w, h, this); p.reset(); p.moveTo(-w / 2.0f, -h / 8.0f); p.lineTo(+w / 2.0f, -h / 8.0f); p.lineTo(-w / 4.0f, +h / 2.0f); p.lineTo(+0.0f, -h / 2.0f); p.lineTo(+w / 4.0f, +h / 2.0f); p.closePath(); at.setToIdentity(); at.translate(w * .5f, h * .5f); g2.transform(at); g2.setStroke(bs); g2.setPaint(redBlend); g2.draw(p); at.setToIdentity(); g2.setTransform(at); g2.setPaint(greenBlend); for (int yy = 0; yy < h; yy += 50) { for (int xx = 0, i = 0; xx < w; i++, xx += 50) { switch (i) { case 0: arc.setArc(xx, yy, 25, 25, 45, 270, Arc2D.PIE); g2.fill(arc); break; case 1: ellipse.setFrame(xx, yy, 25, 25); g2.fill(ellipse); break; case 2: roundRect.setRoundRect(xx, yy, 25, 25, 4, 4); g2.fill(roundRect); break; case 3: rect.setRect(xx, yy, 25, 25); g2.fill(rect); i = -1; } } } } public Graphics2D createDemoGraphics2D(Graphics g) { Graphics2D g2 = null; if (offImg == null || offImg.getWidth() != w || offImg.getHeight() != h) { offImg = (BufferedImage) createImage(w, h); newBufferedImage = true; } if (offImg != null) { g2 = offImg.createGraphics(); g2.setBackground(getBackground()); } // .. set attributes .. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // .. clear canvas .. g2.clearRect(0, 0, w, h); return g2; } public void paint(Graphics g) { w = getWidth(); h = getHeight(); if (w <= 0 || h <= 0) return; Graphics2D g2 = createDemoGraphics2D(g); drawDemo(g2); g2.dispose(); if (offImg != null && isShowing()) { g.drawImage(offImg, 0, 0, this); } newBufferedImage = false; } public void start() { thread = new Thread(this); thread.start(); } public synchronized void stop() { thread = null; } public void run() { Thread me = Thread.currentThread(); while (thread == me && isShowing()) { Graphics g = getGraphics(); paint(g); g.dispose(); thread.yield(); } thread = null; } protected URL getURL(String filename) { URL codeBase = this.getCodeBase(); URL url = null; try { url = new URL(codeBase, filename); } catch (java.net.MalformedURLException e) { System.out.println("Couldn't create image: " + "badly specified URL"); return null; } return url; } public static void main(String s[]) { final ClipImage demo = new ClipImage(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowDeiconified(WindowEvent e) { demo.start(); } public void windowIconified(WindowEvent e) { demo.stop(); } }; JFrame f = new JFrame("Java 2D Demo - ClipImage"); f.addWindowListener(l); f.getContentPane().add("Center", demo); f.setSize(new Dimension(400, 300)); f.show(); demo.start(); } }