Java中AlphaComposite的使用与自定义复合模式
立即解锁
发布时间: 2025-08-18 00:50:45 阅读量: 3 订阅数: 6 

### Java中AlphaComposite的使用与自定义复合模式
#### 1. 创建和设置AlphaComposite
在Java里,可随时通过调用`Graphics2D`对象的`setComposite()`方法来设置`AlphaComposite`。此方法会影响后续所有图形图元的操作,所以绘制完成后,恢复初始复合模式很重要。也可以使用`Graphics.create()`复制绘图表面,完成绘制后丢弃。
创建`AlphaComposite`实例有两种选择:
- **使用预定义实例**:`AlphaComposite`类预定义了一些实例,以公共静态字段形式暴露,如`AlphaComposite.SrcOver`。示例代码如下:
```java
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Composite oldComposite = g2.getComposite();
g2.setComposite(AlphaComposite.SrcOver);
g2.setColor(Color.RED);
g2.fillOval(0, 0, 80, 40);
g2.setComposite(oldComposite);
}
```
预定义实例的额外alpha值为100%。
- **使用`getInstance(int)`方法**:同样可创建alpha值为100%的实例,只需修改一行代码:
```java
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
```
若需使用alpha值低于100%的`AlphaComposite`,则调用`getInstance(int, float)`方法,第二个参数是不透明度,范围为0.0f到1.0f。例如创建一个alpha值为50%的`Source Over`实例:
```java
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
```
#### 2. 更轻松地创建AlphaComposite
Java SE 6引入了`AlphaComposite`类的两个新方法:`derive(int)`和`derive(float)`,可用于获取具有新设置的现有`AlphaComposite`实例的副本。示例如下:
```java
AlphaComposite composite = AlphaComposite.SrcIn;
composite = composite.derive(AlphaComposite.SRC_OVER);
```
调用`derive()`改变规则时,会保留当前alpha值并应用到新规则。也可改变现有alpha复合模式的不透明度,同时保留规则,示例代码如下:
```java
g2.setComposite(AlphaComposite.SrcOver.derive(0.5f));
```
还能链式调用`derive()`同时改变alpha值和规则,替代`getInstance()`方法:
```java
g2.setComposite(composite.derive(0.5f).derive(AlphaComposite.DST_OUT));
```
#### 3. AlphaComposite的常见用途
`AlphaComposite`运用得当,是强大且多功能的工具。下面介绍四个最有用的规则:
| 规则 | 用途 |
| ---- | ---- |
| Clear | 用于重用透明或半透明图像,可轻松擦除背景使图像完全透明。 |
| Src | - |
| SrcOver | 是`Graphics2D`上下文的默认复合模式,确保源完全绘制在目标上,可用于绘制半透明对象而不影响目标。 |
| SrcIn | 用于替换现有绘图的内容,可创建图片框架、裁剪绘图或图像,甚至生成投影。 |
##### 3.1 使用Clear
当想重用透明或半透明图像时,可使用`Clear`规则。其公式为:
```plaintext
Ar = 0
Cr = 0
```
结果不依赖源或目标,可绘制任意内容擦除图片,复合模式的不透明度也无关紧要。示例代码如下:
```java
// The picture has an alpha channel
BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
// Draw stuff
// ...
// Erase the content of the image
g2.setComposite(AlphaComposite.Clear);
// The Color, the Paint, etc. do not matter
g2.fillRect(0, 0, image.getWidth(), image.getHeight());
```
##### 3.2 使用SrcOver
`SrcOver`是`Graphics2D`上下文的默认复合模式,确保源完全绘制在目标上,可用于确保图形区域正确设置,避免应用其他组件对`Graphics`对象的干扰。也可用于绘制半透明对象而不影响目标,可通过改变`AlphaComposite`实例的alpha值控制源的不透明度,还能对`SrcOver`实例的alpha值进行动画处理,创建有趣的出现和消失效果。
##### 3.3 使用SrcIn
`SrcIn`是实用但常被低估的复合模式,可用于替换现有绘图的内容。示例代码如下:
```java
// Draws the blue shield
g2.drawImage(image, x, y, null);
// Replaces the content of the shield with Grand Canyon
g2.setComposite(AlphaCompo
```
0
0
复制全文
相关推荐










