ラスター画像をゼロから作成する

OdGiRasterImage インターフェースは、さまざまな種類のソースデータからラスター画像を数ステップで作成する機能を提供し、結果として得られるラスター画像は、ファイルソースからロードされたラスター画像と同様に、すべての画像処理機能で受け入れられます。この記事では、グラデーション画像をゼロから作成します。このシリーズのパート1で以前に説明した手順を使用して抽出された4つのコーナーピクセルカラーを使用します。

OdGiRasterImage インターフェースを継承するクラスを作成し、画像パラメーターを格納するためのクラスメンバーを追加します。

class GeneratedRasterImage : public OdGiRasterImage
{
    protected:
        OdUInt32 m_pixW, m_pixH;
        PixelFormatInfo m_pf;
        ODCOLORREF m_cornerColors[4];

OdGiRasterImage インターフェースで定義されているすべての必須の抽象純粋仮想メソッドを実装します。

public:
    virtual OdUInt32 pixelWidth() const { return m_pixW; }
    virtual OdUInt32 pixelHeight() const { return m_pixH; }
    virtual OdUInt32 colorDepth() const { return 24; }
    virtual OdUInt32 numColors() const { return 0; }
    virtual ODCOLORREF color(OdUInt32 /*colorIndex*/) const { return 0; }
    virtual OdUInt32 paletteDataSize() const { return 0; }
    virtual void paletteData(OdUInt8* /*bytes*/) const { }
    virtual PixelFormatInfo pixelFormat() const { return m_pf; }
    virtual OdUInt32 scanLinesAlignment() const { return 4; }

ここでは、ラスタ画像構築中に設定される画像幅、高さ、ピクセル形式を単に返します。画像には24ビット/ピクセルの色深度を使用します。パレット関連のメソッドは、インデックス付き画像(8ビット/ピクセル以下の色深度を持つ画像)にのみ必要なので、単にスタブとして実装します。

GeneratedRasterImageクラス内でデータを初期化するために必要となる画像構築メソッドを追加します。

GeneratedRasterImage() : m_pixW(1), m_pixH(1) {}
void configureImage(OdUInt32 nWidth, OdUInt32 nHeight, const PixelFormatInfo &pf, const ODCOLORREF *pColors)
{
    m_pixW = nWidth; m_pixH = nHeight; m_pf = pf;
    for (int i = 0; i < 4; i++)
        m_cornerColors[i] = pColors[i];
}

最後に、scanLines画像メソッドを実装します。

virtual const OdUInt8* scanLines() const { return NULL; }
virtual void scanLines(OdUInt8* scnLines, OdUInt32 firstScanline, OdUInt32 numLines = 1) const
{
    OdUInt32 scanLen = scanLineSize();
    for (OdUInt32 i = firstScanline; i < firstScanline + numLines; i++)
    {
        OdUInt8 *pScanLine = scnLines + ((i - firstScanline) * scanLen);
        for (OdUInt32 j = 0; j < m_pixW; j++, pScanLine += 3)
            computePixel(j, i, pScanLine);
    }
}

生成されたラスター画像クラス内にピクセルデータを保存しないため、直接のscanlinesアクセサーメソッドは常にnullを返します。コピーベースのscanLinesメソッドは、各ピクセルに対して内部のcomputePixelメソッドを呼び出すだけです。computePixelメソッドは、4つの入力色を使用して生成された画像サーフェス内にグラデーションを補間し、計算されたグラデーション色を出力ピクセルバッファに入れます。

void computePixel(OdUInt32 x, OdUInt32 y, OdUInt8 *pOutput) const
{
    // Interpolate colors by X-axis
    const double interpolateX = double(x) / (m_pixW - 1);
    const ODCOLORREF bottom = ODRGB((1.0 - interpolateX) * ODGETRED(m_cornerColors[0]) + interpolateX * ODGETRED(m_cornerColors[1]),
          (1.0 - interpolateX) * ODGETGREEN(m_cornerColors[0]) + interpolateX * ODGETGREEN(m_cornerColors[1]),
          (1.0 - interpolateX) * ODGETBLUE(m_cornerColors[0]) + interpolateX * ODGETBLUE(m_cornerColors[1]));
    const ODCOLORREF top = ODRGB((1.0 - interpolateX) * ODGETRED(m_cornerColors[2])   + interpolateX * ODGETRED(m_cornerColors[3]),
          (1.0 - interpolateX) * ODGETGREEN(m_cornerColors[2]) + interpolateX * ODGETGREEN(m_cornerColors[3]),
          (1.0 - interpolateX) * ODGETBLUE(m_cornerColors[2]) + interpolateX * ODGETBLUE(m_cornerColors[3]));
    // Interpolate colors in Y-axis
    const double interpolateY = double(y) / (m_pixH - 1);
    const ODCOLORREF color = ODRGB((1.0 - interpolateY) * ODGETRED(bottom) + interpolateY * ODGETRED(top),
          (1.0 - interpolateY) * ODGETGREEN(bottom) + interpolateY * ODGETGREEN(top),
          (1.0 - interpolateY) * ODGETBLUE(bottom)  + interpolateY * ODGETBLUE(top));
    pOutput[0] = ODGETRED(color); pOutput[1] = ODGETGREEN(color); pOutput[2] = ODGETBLUE(color);
}

画像クラスの実装例が完成しました。次に、GeneratedRasterImageクラスのインスタンスを作成し、初期化して、ファイル保存やさらなる実験のために出力ラスター画像を保存します。

OdGiRasterImagePtr pOutputImage;
{
    OdSmartPtr<GeneratedRasterImage> pImage = OdRxObjectImpl<GeneratedRasterImage>::createObject();
    pImage->configureImage(256, 256, pInputImage->pixelFormat(), inputColors);
    pOutputImage = pImage;
}

これで、このシリーズのパート1にある「ファイルにラスター画像を保存する」のコードを使用して、生成されたラスター画像を保存し、結果のファイルを確認できます。

今すぐ始める

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

無料で試す