我试图将叠加(水印)放在基本图像上。假设它看起来像这样:
不透明矩形,"完全透明"文字就可以了。即文本的所有像素都是透明的,以及它下面的背景。
我在Photoshop中做了60%的不透明度:
只需在代码中撰写:
MagickWand* overlay = NewMagickWand();
MagickReadImage(overlay, overlaypath);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);
//all open/destroy code is omitted
结果是矩形是半透明的,而文本是完全透明的:
到目前为止一直很好,但我也希望通过应用程序配置来规范叠加不透明度,所以我尝试了第二种方式:
Photoshop中的100%(与本文中的第一张图片一样)并尝试通过MagickWand设置透明度:
MagickReadImage(overlay, overlaypath);
MagickSetImageOpacity(overlay, 0.6);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);
结果是完全空白的矩形,但半透明
看起来MagickSetImageOpacity
将每个像素alpha通道设置为相同的0.6值,无论其当前值如何。对于currentAlpha -= givenAlpha
魔杖的每个像素,我需要overlay
。如果没有手动迭代每个魔杖像素,这可能吗?
答案 0 :(得分:2)
实现currentAlpha -= givenAlpha
的正确方法是通过每个像素调用PixelIterator和迭代器,并将givenAlpha应用于PixelSetAlpha。但是,根据您的需要,您可以使用MagickColorizeImage来应用相同的效果。
PixelWand *pColorize = NewPixelWand();
PixelWand *pGivenAlpha = NewPixelWand();
double userOpacity = 0.6;
// May need to be adjusted to "white" or "black" depending on your mask
PixelSetColor(pColorize, "transparent");
PixelSetAlpha(pGivenAlpha, userOpacity);
MagickWand *overlay = NewMagickWand();
MagickReadImage(overlay, overlaypath);
MagickColorizeImage(overlay, pColorize, pGivenAlpha); // Apply opacity filter
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);