[返回博客](/cn/blog) # 为栅格图像添加 Alpha 通道

Egor Slupko 五月 17, 2017 [\#Alpha channel](/cn/blog/tag/alpha-channel) [\#rendering](/cn/blog/tag/rendering)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

以前，Teigha 开发人员可以使用 OdGiRasterImage::convert 方法为栅格图像添加 Alpha 通道，然后裁剪背景颜色。然而，使用新的 OdGiRasterImage 包装器 OdGiRasterImageAlphaChannelAdder 简化了此任务。

### 创建对象

在创建 OdGiRasterImageAlphaChannelAdder 实例之前，请获取原始 OdGiRasterImage 的实例。有几种方法可以获取它。例如，如果原始图像是一个文件，我们可以使用 Teigha 栅格服务加载它：

```
OdRxRasterServicesPtr pRasSvcs = odrxDynamicLinker()->loadApp(RX_RASTER_SERVICES_APPNAME, false); 
if (pRasSvcs.isNull()) // Check that raster services module correctly loaded 
throw OdError(eNullPtr); 
OdGiRasterImagePtr pOriginalImage = pRasSvcs->loadRasterImage(inputFileName); 
if (pOriginalImage.isNull()) // Check that raster image correctly loaded throw OdError(eNullPtr);
```

如果我们有可以从中获取栅格图像的 OdGsDevice，请使用以下代码：

```
OdGiRasterImagePtr pOriginalImage = OdGiRasterImagePtr(pDevice->properties()->getAt(L"RasterImage"));>
if (pOriginalImage.isNull())
      throw OdError(eNullPtr);
```

获取原始图像实例后，创建 OdGiRasterImageAlphaChannelAdder 实例：

```
OdGiRasterImagePtr pImage = OdGiRasterImageAlphaChannelAdder::createObject( pOriginalImage, CutOffColor, CutOffColorThreshold );
if (pImage.isNull())
throw OdError(eNullPtr);
```

其中 CutOffColor 是将分配 Alpha 值 0 的像素颜色，CutOffColorThreshold 是 Alpha 插值的阈值（如下所述）。

### 使用 OdGiRasterImageAlphaChannelAdder

我们可以像使用普通的 OdGiRasterImage 一样使用 OdGiRasterImageAlphaChannelAdder 实例。例如，我们可以使用 Teigha 栅格服务保存它：

```
pRasSvcs->saveRasterImage( pImage, ouptupFileName );
```

我们还可以使用 OdGiRasterImage::scanLines 方法访问图像像素。然而，由于 OdGiRasterImageAlphaChannelAdder 不存储兼容的像素数组，因此不允许直接访问，并且

```
const OdUInt8 *pPixels = pImage->scanLines();
```

将返回 NULL 指针。代替直接访问，将像素数组复制到中间的用户定义数组中：

```
OdUInt8Array scanLine;
scanLine.resize(pInputImage->scanLineSize());
pImage->scanLines(scanLine.asArrayPtr(), 0);
```

### 使用像素截止颜色和阈值

例如，让我们使用以下具有不同灰色矩形和白色背景的栅格图像：

![Rectangles 1](/files/inline-images/image001_0.png)创建一个具有白色截止颜色和零阈值的 OdGiRasterImageAlphaChannelAdder，并将其保存到文件中：

```
OdRxRasterServicesPtr pRasSvcs = odrxDynamicLinker()->loadApp(RX_RASTER_SERVICES_APPNAME, false);
if (pRasSvcs.isNull()) // Check that raster services module correctly loaded
      throw OdError(eNullPtr);
OdGiRasterImagePtr pOriginalImage = pRasSvcs->loadRasterImage(inputFileName);
if (pOriginalImage.isNull()) // Check that raster image correctly loaded
      throw OdError(eNullPtr);
OdGiRasterImagePtr pImage = OdGiRasterImageAlphaChannelAdder::createObject( pOriginalImage, ODRGB( 255, 255, 255 ) );
if (pImage.isNull())
      throw OdError(eNullPtr);
pRasSvcs->saveRasterImage( pImage, ouptupFileName );
```

结果如下：

![Rectangles 2](/files/inline-images/image003_0.png)  
所有白色像素现在都具有零 Alpha 值。  
我们可以使用阈值进行平滑切割。如果阈值不为零，则位于区间 \[截止颜色分量值 – 阈值；截止颜色分量值 + 阈值\] 内的每个像素颜色都将被分配在区间 \[颜色 = 截止颜色，Alpha 值 = 0 -&gt; 颜色 = 截止颜色 + 阈值，Alpha 值 = 255\] 上插值的 Alpha 值。  
因此，如果我们将阈值设置为 20，我们将得到以下结果：

![Rectangles 3](/files/inline-images/image005_0.png)  
所有白色像素仍然是透明的，最后一个矩形的像素变为半透明。  
如果我们将阈值增加到 40，最后一个矩形变得更透明，倒数第二个矩形变为半透明：

![Rectangles 4](/files/inline-images/image007_0.png)### 结论

OdGiRasterImageAlphaChannelAdder 为 Teigha 开发人员提供了一种为栅格图像设置 Alpha 通道的简单方法。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
