ラスタ画像にアルファチャンネルを追加する

以前は、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);

ピクセルカットカラーと閾値の使用

例として、異なる灰色の長方形と白い背景を持つ以下のラスター画像を使用します。

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


すべての白いピクセルは、アルファ値がゼロになります。
閾値を使用してスムーズなカットを行うことができます。閾値がゼロでない場合、[カットカラー成分値 – 閾値; カットカラー成分値 + 閾値] の範囲内にある各ピクセルの色は、[カラー = カットカラー、アルファ値 = 0 -> カラー = カットカラー + 閾値、アルファ値 = 255] の範囲で補間されたアルファ値が割り当てられます。
したがって、閾値を20に設定すると、次の結果が得られます。
 

Rectangles 3


すべての白いピクセルは依然として透明であり、最後の長方形のピクセルは部分的に透明になります。
閾値を40まで上げると、最後の長方形はより透明になり、最後から2番目の長方形は部分的に透明になります。

Rectangles 4

結論

OdGiRasterImageAlphaChannelAdderは、Teigha開発者にラスター画像にアルファチャネルを設定する簡単な方法を提供します。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す