clipimage.java

来自「这是《Java案例精粹150例(上册)》一书配套的源代码。」· Java 代码 · 共 246 行

JAVA
246
字号

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowAdapter;
import java.awt.image.BufferedImage;
import java.net.URL;

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; // 椭圆的宽和高
	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() {
		setBackground(Color.white);
		img = getImage(getURL("images/Hill.jpg"));
		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());
		}

		// 设置属性
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_RENDERING,
				RenderingHints.VALUE_RENDER_QUALITY);

		// 清除画布
		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);

		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();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?