ImageMagick高级透明度控制

ImageMagick高级透明度控制,c,imagemagick,C,Imagemagick,我正试图把覆盖(水印)的基础图像。假设它看起来像这样: 不透明矩形,上面有“完全透明”的文本。也就是说,文本的所有像素以及其下的背景都是透明的 1路: 我在Photoshop中不透明度为60%: 只需编写代码: MagickWand* overlay = NewMagickWand(); MagickReadImage(overlay, overlaypath); MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);

我正试图把覆盖(水印)的基础图像。假设它看起来像这样:

不透明矩形,上面有“完全透明”的文本。也就是说,文本的所有像素以及其下的背景都是透明的

1路: 我在Photoshop中不透明度为60%:

只需编写代码:

MagickWand* overlay = NewMagickWand();
MagickReadImage(overlay, overlaypath);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);
//all open/destroy code is omitted
结果是矩形是半透明的,而文本是完全透明的:

到目前为止还不错,但我还想通过应用程序配置来调节覆盖不透明度,所以我尝试了第二种方法:

双向: 100%使用Photoshop(正如本文第一张图片一样),并尝试通过MagickWand设置透明度:

MagickReadImage(overlay, overlaypath);
MagickSetImageOpacity(overlay, 0.6);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);
结果是完全空白的矩形,虽然是半透明的


它看起来像是
MagickSetImageOpacity
将每个像素alpha通道设置为相同的0.6值,而不管其当前值如何。我需要的是
currentAlpha-=givenAlpha
覆盖的每个像素。如果不手动迭代每个魔杖像素,这是可能的吗?

实现
currentAlpha-=givenAlpha
的正确方法是调用一个,对每个像素进行迭代,并应用givenAlpha。但对于您的需要,您可能可以应用相同的效果


事实上,我刚刚完成了解决方案通过像素迭代器的基础上,它的工作。我看到彩色滤镜也可以工作,那么您的意见是什么,什么方法更快/更正确?UPD:您的方法也很有效。我想我会尝试一些benhmarks来找出这两种方法中最快的方法,但这可能是我最初的问题。谢谢。按照像素迭代的一般做法,它将为您提供更大的灵活性,并减少技术部门的工作量,因为它不会在“这一良好工作”解决方案背后隐藏任何业务逻辑。还将使您能够更好地控制优化。
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);