C# MagickImage创建100%透明的软边

C# MagickImage创建100%透明的软边,c#,imagemagick.net,C#,Imagemagick.net,我的目标是在任何图片上创建一个软边框,边缘变成100%透明的颜色(你应该看不到图像的边缘) 这是原始图像: 我发现这个(): 这就是我做这件事的依据: var mImage = new MagickImage(image); mImage.Format = MagickFormat.Png; mImage.Alpha(AlphaOption.Set); mImage.VirtualPixelMethod = VirtualPixelMethod.Transparent; var form

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

这是原始图像:

我发现这个():

这就是我做这件事的依据:

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%透明,以便在web上使用图像时图像边缘不可见?

尝试以下方法:

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

编辑: 我会尽量把代码放在一个更像fancy的脚本中,这样对我来说就容易了。如果不优雅,我很抱歉:

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");


这个例子几乎是正确的。当删除
复合
操作时,它会起作用。命令行示例解释为:

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");
}

我无法将此转换为C。你能帮帮我吗?它不能。如果我使用mask.Write(流),则会得到一个白色图像。如果我执行image.Write(stream),那么我会得到与输入图像相同的图像。还有各种打字错误。您已经编写了maks.Composite而不是mask.Composite,以及MagicksColor.Black而不是MagickColors.BlackUpdate。我忘了将图像的格式更改为.PNG。我现在得到了一些不同的东西。这次我得到了一个黑白图像,有边缘。这些边缘是模糊的(读得更暗),但没有梯度。这就是你必须用作遮罩的图像!我看到您对代码进行了一些更新,我尝试了一下,现在我得到了一个与我用作输入的图像相同的图像。此外如果边缘模糊,但不是渐变,如果添加了渐变,该遮罩将如何导致渐变?
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");

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");
}