# 剪切绘图区域

> 原文： [https://docs.oracle.com/javase/tutorial/2d/advanced/clipping.html](https://docs.oracle.com/javase/tutorial/2d/advanced/clipping.html)

任何 [`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 对象都可以用作限制将要渲染的绘图区域部分的剪切路径。剪切路径是 [`Graphics2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics2D.html) 上下文的一部分;要设置剪辑属性，请调用`Graphics2D.setClip`并传入定义要使用的剪切路径的`Shape`。您可以通过调用`clip`方法并传入另一个`Shape`来缩小剪切路径;剪辑设置为当前剪辑与指定`Shape`的交集。

## 示例：ClipImage

此示例为剪切路径设置动画以显示图像的不同部分。

&lt;applet alt="applet animates clipping path" archive="examples/lib/ClipImageApplet.jar" code="ClipImage" height="300" width="300"&gt;&lt;param name="permissions" value="sandbox"&gt;&lt;/applet&gt;

* * *

**Note:**  If you don't see the applet running, you need to install at least the [Java SE Development Kit (JDK) 7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) release.

* * *

[`ClipImage.java`](examples/ClipImage.java) 包含此 applet 的完整代码。小程序需要 [`clouds.jpg`](examplhttps://docs.oracle.com/javase/tutorial/images/clouds.jpg) 图像文件。

剪切路径由椭圆和矩形的交点定义，其尺寸是随机设置的。将椭圆传递给`setClip`方法，然后调用`clip`将剪切路径设置为椭圆和矩形的交点。

```
private Ellipse2D ellipse = new Ellipse2D.Float();
private Rectangle2D rect = new Rectangle2D.Float();
...
ellipse.setFrame(x, y, ew, eh);
g2.setClip(ellipse);
rect.setRect(x+5, y+5, ew-10, eh-10);
g2.clip(rect);

```

## 示例：Starry

还可以从文本字符串创建剪辑区域。以下示例使用字符串 _ 星夜 _ 创建`TextLayout`。然后，它得到`TextLayout`的轮廓。 [`TextLayout.getOutline`](https://docs.oracle.com/javase/8/docs/api/java/awt/font/TextLayout.html#getOutline-java.awt.geom.AffineTransform-) 方法返回`Shape`对象，并从`Shape`对象的边界创建`Rectangle`。边界包含布局可以绘制的所有像素。图形上下文中的颜色设置为蓝色，并绘制轮廓形状，如下图和代码片段所示。

<center>![The Starry Night text (outline)](img/858a497e45605021bbb6564d33c175d0.jpg)</center>

```
FontRenderContext frc = g2.getFontRenderContext();
Font f = new Font("Helvetica", 1, w/10);
String s = new String("The Starry Night");
TextLayout textTl = new TextLayout(s, f, frc);
AffineTransform transform = new AffineTransform();
Shape outline = textTl.getOutline(null);
Rectangle r = outline.getBounds();
transform = g2.getTransform();
transform.translate(w/2-(r.width/2), h/2+(r.height/2));
g2.transform(transform);
g2.setColor(Color.blue);
g2.draw(outline);   

```

接下来，使用从`getOutline`创建的`Shape`对象在图形上下文中设置剪切区域。 `starry.gif`图像是梵高的着名画作 _ 星夜 _，从`Rectangle`对象的左下角开始绘制到这个剪辑区域。

```
g2.setClip(outline);
g2.drawImage(img, r.x, r.y, r.width, r.height, this);

```

&lt;applet alt="applet showing Starry Night painting in clipping area" archive="examples/lib/StarryApplet.jar" code="Starry" height="150" width="600"&gt;&lt;param name="permissions" value="sandbox"&gt;&lt;/applet&gt;

* * *

**Note:**  If you don't see the applet running, you need to install at least the [Java SE Development Kit (JDK) 7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) release.

* * *

[`Starry.java`](examples/Starry.java) 包含此程序的完整代码。此 applet 需要 [`Starry.gif`](examplhttps://docs.oracle.com/javase/tutorial/images/Starry.gif) 图像文件。