以前,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);
使用像素截止颜色和阈值
例如,让我们使用以下具有不同灰色矩形和白色背景的栅格图像:
创建一个具有白色截止颜色和零阈值的 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 );
结果如下:
所有白色像素现在都具有零 Alpha 值。
我们可以使用阈值进行平滑切割。如果阈值不为零,则位于区间 [截止颜色分量值 – 阈值;截止颜色分量值 + 阈值] 内的每个像素颜色都将被分配在区间 [颜色 = 截止颜色,Alpha 值 = 0 -> 颜色 = 截止颜色 + 阈值,Alpha 值 = 255] 上插值的 Alpha 值。
因此,如果我们将阈值设置为 20,我们将得到以下结果:
所有白色像素仍然是透明的,最后一个矩形的像素变为半透明。
如果我们将阈值增加到 40,最后一个矩形变得更透明,倒数第二个矩形变为半透明:
结论
OdGiRasterImageAlphaChannelAdder 为 Teigha 开发人员提供了一种为栅格图像设置 Alpha 通道的简单方法。