【问题标题】:MagickImage create soft edge that goes into 100% transparentMagickImage 创建软边缘,进入 100% 透明
【发布时间】:2020-07-01 18:34:30
【问题描述】:

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

这是原图:

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

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

【问题讨论】:

    标签: c# imagemagick.net


    【解决方案1】:

    这个例子几乎是正确的。当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");
    }
    

    【讨论】:

      【解决方案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# 时遇到问题。你能帮帮我吗?
      • 它没有。如果我做 mask.Write(stream) 那么我得到一个白色的图像。如果我执行 image.Write(stream) ,那么我会得到与输入图像相同的图像。还有各种错别字。你写的是 maks.Composite 而不是 mask.Composite 和 MagicksColor.Black 而不是 MagickColors.Black
      • 更新。我忘记将图像格式更改为 .PNG。我现在得到了一些不同的东西。这次我得到了一张有边缘的黑白图像。这些边缘是模糊的(读得更暗),但没有渐变。
      • 这就是你必须用作蒙版的图像!
      • 我看到你更新了你的代码,我试过了,现在我得到了一个与我用作输入的图像相同的图像。此外。如果边缘是模糊的,但不是渐变,如果添加了该遮罩,它将如何导致渐变?
      猜你喜欢
      • 2018-07-18
      • 2020-02-01
      • 1970-01-01
      • 2012-05-09
      • 2021-10-31
      • 1970-01-01
      • 2019-01-02
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多