以前は、Teigha開発者はOdGiRasterImage::convertメソッドを使用してラスタ画像にアルファチャンネルを追加し、その後背景色を切り取ることができました。しかし、新しい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はアルファ値0が割り当てられるピクセルの色であり、CutOffColorThresholdはアルファ補間(下記参照)のしきい値です。
OdGiRasterImageAlphaChannelAdderの操作
OdGiRasterImageAlphaChannelAdderのインスタンスは、通常のOdGiRasterImageとして操作できます。たとえば、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 );
結果は次のとおりです。
すべての白いピクセルは、アルファ値がゼロになります。
閾値を使用してスムーズなカットを行うことができます。閾値がゼロでない場合、[カットカラー成分値 – 閾値; カットカラー成分値 + 閾値] の範囲内にある各ピクセルの色は、[カラー = カットカラー、アルファ値 = 0 -> カラー = カットカラー + 閾値、アルファ値 = 255] の範囲で補間されたアルファ値が割り当てられます。
したがって、閾値を20に設定すると、次の結果が得られます。
すべての白いピクセルは依然として透明であり、最後の長方形のピクセルは部分的に透明になります。
閾値を40まで上げると、最後の長方形はより透明になり、最後から2番目の長方形は部分的に透明になります。
結論
OdGiRasterImageAlphaChannelAdderは、Teigha開発者にラスター画像にアルファチャネルを設定する簡単な方法を提供します。