ImageMagick高级透明度控制

时间:2014-07-23 13:14:57

标签: c imagemagick

我试图将叠加(水印)放在基本图像上。假设它看起来像这样:

enter image description here

不透明矩形,"完全透明"文字就可以了。即文本的所有像素都是透明的,以及它下面的背景。

1路:

我在Photoshop中做了60%的不透明度:

enter image description here

只需在代码中撰写:

MagickWand* overlay = NewMagickWand();
MagickReadImage(overlay, overlaypath);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);
//all open/destroy code is omitted

结果是矩形是半透明的,而文本是完全透明的:

enter image description here

到目前为止一直很好,但我也希望通过应用程序配置来规范叠加不透明度,所以我尝试了第二种方式:

2路:

Photoshop中的100%(与本文中的第一张图片一样)并尝试通过MagickWand设置透明度:

MagickReadImage(overlay, overlaypath);
MagickSetImageOpacity(overlay, 0.6);
MagickCompositeImage(wand, overlay, OverCompositeOp, 100, 100);

结果是完全空白的矩形,但半透明

enter image description here

看起来MagickSetImageOpacity每个像素alpha通道设置为相同的0.6值,无论其当前值如何。对于currentAlpha -= givenAlpha魔杖的每个像素,我需要overlay。如果没有手动迭代每个魔杖像素,这可能吗?

1 个答案:

答案 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);
相关问题