MagickImage创建一个渐变边缘,渐变到100%透明。

3

我的目标是在任何图像的边缘处创建一个软边框,使边缘变成100%透明的颜色(您不应该看到图像的边界)。

这是原始图像:

enter image description here

我找到了这个(http://www.imagemagick.org/Usage/thumbnails/#rounded):

enter image description here

convert thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png

这就是我从中制作出来的内容:
var mImage = new MagickImage(image);
mImage.Format = MagickFormat.Png;
mImage.Alpha(AlphaOption.Set);
mImage.VirtualPixelMethod = VirtualPixelMethod.Transparent;

var form = mImage.Clone();
form.Level(new Percentage(50), new Percentage(100),Channels.Alpha);
form.Blur(100, 50,Channels.Alpha);
mImage.Composite(form);
mImage.Write(image);

那么得到的结果是这样的:

输入图像描述

然而,你仍然可以清楚地看到边缘,因此它们不够透明。

当我将图像带入Paint.NET时,我发现边缘确实有些透明,但边缘可能只有50%透明度,而不是100%。

输入图像描述

我尝试过调整级别百分比、模糊等等,但似乎无法使边缘正确模糊化。

我该如何使边缘变为100%透明,以便在网络上使用图像时,图像的边缘变得不可见?

2个回答

2

试试这个:

convert input.png -bordercolor black -fill white \
   \( -clone 0 -colorize 100 -shave 10x10 -border 10x10 -blur 0x10 \) \
   -compose copyopacity -composite output.png

C#

using (MagickImage mImage = new MagickImage(image))
{
    mImage.Format = MagickFormat.Png;

    using (IMagickImage mask = mImage.Clone())
    {
        mask.Format = MagickFormat.Png;

        mask.BorderColor = MagickColors.Black;
        mask.Colorize(MagickColors.White, new Percentage(100));
        mask.Shave(50, 50);
        mask.Border(50, 50);
        mask.Blur(0, 10);
        mImage.Composite(mask, CompositeOperator.CopyAlpha);

        mImage.Write(image);
        image.Position = 0;
    }
}

编辑:

我会尝试将代码写成更具脚本风格的形式,这样更容易理解。如果不够优雅,请多多包涵。

var image = new MagickImage("input.jpg");
var mask = image.Clone();
mask.BorderColor = MagickColors.Black;
mask.Colorize(MagickColors.White, new Percentage(100));
mask.Shave(10,10);
mask.Border(10,10);
mask.Blur(0,10);
image.Composite(mask, CompositeOperator.CopyAlpha);
image.Format = MagickFormat.Png;
image.Write("output.png");


我在将这个转换成C#时遇到了问题。你能帮我吗? - Bjørn
它不会。如果我执行mask.Write(stream),那么我得到的是白色图像。如果我执行image.Write(stream),那么我得到的是与输入图像相同的图像。还有各种错别字。你写成了maks.Composite而不是mask.Composite,MagicksColor.Black而不是MagickColors.Black。 - Bjørn
更新。我忘记将图像格式更改为.PNG。现在我得到了不同的东西。这次我得到了一张黑白边缘图像。这些边缘被模糊化(读作更暗),但没有渐变。 - Bjørn
我看到你更新了一下代码,我试了一下,现在我得到了一个与我用作输入的图像完全相同的图像。此外,如果边缘被模糊但没有梯度,那么如果添加了遮罩,它将如何导致梯度呢? - Bjørn
是的,对我来说它有效。我添加了一个更像脚本的版本。 - Alessandro
显示剩余3条评论

2

这个例子几乎正确。当移除Composite操作时,它可以正常工作。命令行示例翻译为:

using (var image = new MagickImage("thumbnail.gif"))
{
    // -alpha set
    image.Alpha(AlphaOption.Set);

    // -virtual-pixel transparent
    image.VirtualPixelMethod = VirtualPixelMethod.Transparent;

    // -channel A means that the next operations should only change the alpha channel

    // - blur 0x8
    image.Blur(0, 8, Channels.Alpha);

    // -level 50%,100%
    image.Level(new Percentage(50), new Percentage(100), Channels.Alpha);

    // +channel cancels only allow operations on the alpha channel.

    image.Write("soft_edge.png");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接