1

2 つのフレームのシーケンスを持つ画像があります。2 番目のフレームは、最初のフレームのアルファ マスクになるはずです。

次に例を示します。

http://i.imgur.com/c2M10u7.png

Magick++ を使用して画像を 2 つに分割し、アルファ マスクを適用する次のコードを記述しました。

#include "stdafx.h"
#include <iostream>
#include <Magick++.h>

int main(int argc, char **argv)
{
    Magick::InitializeMagick(*argv);

    Magick::Image base, mask;
    std::string image;

    if (argc > 1)
    {
        image = argv[1];
    }
    else
        return EXIT_FAILURE;

    // Read image
    base.read(image);
    mask = base;

    // Crop out mask and sprite
    base.crop(Magick::Geometry(base.columns() / 2, base.rows(), 0, 0));
    mask.crop(Magick::Geometry(mask.columns() / 2, mask.rows(), mask.columns() / 2, 0));

    // Apply mask
    base.composite(mask, 0, 0, Magick::BlendCompositeOp);

    // Write
    base.write("output.png");

    return EXIT_SUCCESS;
}

ただし、これを単にブレンドするのではなく、実際にアルファ マスクとして適用する方法がわかりません。少なくともC ++では、どこにも解決策が見つかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

両方の画像でアルファ チャネルを無効にし、Blend の代わりにCopyOpacityを使用する必要があります。また、マスクが反転しているように見えるので、おそらく無効にする必要があります. 以下は C++ での例です。

// Crop out mask and sprite
base.crop(Magick::Geometry(base.columns() / 2, base.rows(), 0, 0));
mask.crop(Magick::Geometry(mask.columns() / 2, mask.rows(), mask.columns() / 2, 0));

// Disable alpha channel
base.matte(false);
mask.matte(false);

// Invert the mask
mask.negate();

// Apply mask
base.composite(mask, 0, 0, Magick::CopyOpacityCompositeOp);
于 2015-04-28T11:09:42.763 に答える