# 合成图形

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

[`AlphaComposite`](https://docs.oracle.com/javase/8/docs/api/java/awt/AlphaComposite.html) 类封装了各种合成样式，用于确定重叠对象的呈现方式。 `AlphaComposite`也可以具有指定透明度的 alpha 值：alpha = 1.0 完全不透明，alpha = 0.0 完全透明（clear）。 `AlphaComposite`支持下表中显示的大多数标准 Porter-Duff 合成规则。

| 合成规则 | 描述 |
| --- | --- |
| 来源（`SRC_OVER`）
![Source-over compositing](img/85395aa80e20b02cc776d56ce31ed11e.jpg) | 如果正在渲染的对象（源）中的像素具有与先前渲染的像素（目标）相同的位置，则在目标像素上渲染源像素。 |
| 来源（`SRC_IN`）
![Source-in compositing](img/e63ec0d05994afdcc5ae312604160f74.jpg) | 如果源和目标中的像素重叠，则仅渲染重叠区域中的源像素。 |
| 源出（`SRC_OUT`）
![Source-out compositing](img/ad0f2a651322e3cac55513d98ceed0f5.jpg) | 如果源和目标中的像素重叠，则仅渲染重叠区域外的源像素。重叠区域中的像素被清除。 |
| 目的地（`DST_OVER`）
![Destination-over compositing](img/11db5d580b448f1841945d150ea083c1.jpg) | 如果源和目标中的像素重叠，则仅渲染重叠区域外的源像素。重叠区域中的像素不会改变。 |
| 目的地（`DST_IN`）
![Destination-in compositing](img/1aa2993d7f2a286b6111b9215b3baedf.jpg) | 如果源和目标中的像素重叠，则源中的 alpha 将应用于重叠区域中的目标像素。如果 alpha = 1.0，则重叠区域中的像素不变;如果 alpha 为 0.0，则清除重叠区域中的像素。 |
| 目的地输出（`DST_OUT`）
![Destination-out compositing](img/e38722d93c4db177d0f119e6b60601bf.jpg) | 如果源和目标中的像素重叠，则源中的 alpha 将应用于重叠区域中的目标像素。如果 alpha = 1.0，则清除重叠区域中的像素;如果 alpha 为 0.0，则重叠区域中的像素不变。 |
| 清除（`CLEAR`）
![Clear with overlap compositing](img/3b797fb9c52e3bb8aa6bf59d5bd15e1e.jpg) | 如果源和目标中的像素重叠，则清除重叠区域中的像素。 |

要更改 [`Graphics2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics2D.html) 类使用的合成样式，请创建`AlphaComposite`对象并将其传递给`setComposite`方法。

## 示例：复合

该程序说明了各种合成风格和 alpha 组合的效果。

&lt;applet alt="applet showing compositing style and alpha combinations" archive="examples/lib/CompositeApplet.jar" code="Composite" 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.

* * *

[``Composite.java`` ](examples/Composite.java)。包含此 applet 的完整代码。

通过调用`AlphaComposite.getInstance`并指定所需的合成规则来构造新的`AlphaComposite`对象 _ac_ 。

```
AlphaComposite ac =
  AlphaComposite.getInstance(AlphaComposite.SRC);

```

当选择不同的合成规则或 alpha 值时，再次调用`AlphaComposite.getInstance`，并将新`AlphaComposite`分配给 _ac_ 。除了每像素 alpha 值之外，还应用选定的 alpha，并将其作为第二个参数传递给`AlphaComposite`。 `getInstance`。

```
ac = AlphaComposite.getInstance(getRule(rule), alpha);

```

通过将`AlphaComposite`对象传递给`Graphics 2D` `setComposite`来修改复合属性。对象被渲染为`BufferedImage`并稍后复制到屏幕，因此复合属性在`BufferedImage`的`Graphics2D`上下文中设置：

```
BufferedImage buffImg = new BufferedImage(w, h,
                        BufferedImage.TYPE_INT_ARGB);
Graphics2D gbi = buffImg.createGraphics();
...
gbi.setComposite(ac);

```