【问题标题】:ImageMagick advanced transparency controlImageMagick 高级透明度控制
【发布时间】:2014-09-14 16:44:43
【问题描述】:

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

带有“完全透明”文本的不透明矩形。 IE。文本的所有像素都是透明的,下面的背景也是如此。

1路:

我在 Photoshop 中设置不透明度 60%:

只需在代码中编写它:

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

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

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

2路:

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

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

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

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

【问题讨论】:

    标签: c imagemagick


    【解决方案1】:

    实现currentAlpha -= givenAlpha 的正确方法是调用PixelIterator,并通过每个像素进行迭代,然后将给定Alpha 与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);
    

    【讨论】:

    • 实际上我刚刚通过像素迭代器db.tt/IwUcwJ8v 完成了基于this sample 的解决方案,它可以工作。我看到 colorize 过滤器也可以工作,那么您的意见是什么,哪种方法更快/更正确?
    • UPD:你的方法也很好用。我想我会尝试一些基准来找出这两者中最快的方法,但这可能不是我最初的问题。谢谢。
    • 采用像素迭代的常见做法,它会为您提供更大的灵活性并减少技术部门,因为它不会隐藏任何业务逻辑隐藏在“工作良好”的解决方案后面。还可以让您更好地控制优化。
    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2012-03-28
    • 1970-01-01
    • 2011-12-14
    • 2014-07-01
    • 2017-11-28
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多