我有一个图像,它有两个帧的序列。第二帧应该是第一帧的 alpha 蒙版。
这是一个例子:
我使用 Magick++ 编写了以下代码,将图像分成两半,并应用 alpha 蒙版:
#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;
}
但是,我不知道如何实际应用它作为 alpha 蒙版,而不仅仅是混合它。我也无法在任何地方找到它的解决方案,至少对于 C++ 来说是这样。
您应该禁用两个图像上的 Alpha 通道并使用 CopyOpacity 而不是 Blend。看起来你的面具也被颠倒了,所以你应该否定它。以下是 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);