为栅格图像添加 Alpha 通道

以前,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

创建一个具有白色截止颜色和零阈值的 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


所有白色像素现在都具有零 Alpha 值。
我们可以使用阈值进行平滑切割。如果阈值不为零,则位于区间 [截止颜色分量值 – 阈值;截止颜色分量值 + 阈值] 内的每个像素颜色都将被分配在区间 [颜色 = 截止颜色,Alpha 值 = 0 -> 颜色 = 截止颜色 + 阈值,Alpha 值 = 255] 上插值的 Alpha 值。
因此,如果我们将阈值设置为 20,我们将得到以下结果:
 

Rectangles 3


所有白色像素仍然是透明的,最后一个矩形的像素变为半透明。
如果我们将阈值增加到 40,最后一个矩形变得更透明,倒数第二个矩形变为半透明:

Rectangles 4

 

结论

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

今天就开始行动

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

免费试用