【问题标题】:Convert JPG to PNG with background transparency using ImageMagick.Net使用 ImageMagick.Net 将 JPG 转换为具有背景透明度的 PNG
【发布时间】:2017-12-06 09:47:53
【问题描述】:

我需要将 JPG 图像转换为 PNG 并将其白色背景更改为透明。我正在使用 ImageMagick.NET,我发现以下 ImageMagick 命令应该可以实现我想要实现的目标:

convert image.jpg -fuzz XX% -transparent white result.png

我尝试将其转换为 c#,但我得到的只是一个白色背景的 png 图像。我的代码sn-p:

using (var img = new MagickImage("image.jpg"))
{
     img.Format = MagickFormat.Png;
     img.BackgroundColor = MagickColors.White;
     img.ColorFuzz = new Percentage(10);
     img.BackgroundColor = MagickColors.None;
     img.Write("image.png");
}

我们将不胜感激任何形式的帮助。谢谢!!

【问题讨论】:

  • img.BackgroundColor = MagickColors.White; 你不能用MagickColours.Transparent 代替吗? (如果存在)
  • 两次使用BackgroundColor有意义吗?首先是 MagickColors.White,然后是 MagickColors.None?
  • 非常感谢您的建议。它确实存在。 MagickColors.Transparent 将 RGBA 值设置为 #FFFFFF00。尝试用MagickColours.Transparent 替换MagickColors.White 并删除BackgroundColor 的第二个实例,但它仍然给我相同的结果。具有白色背景的 PNG 图像...

标签: c# uwp imagemagick magick.net imagemagick.net


【解决方案1】:

这是一个较晚的回复,因为我自己花了一段时间才找到答案,但这似乎对我很有效。查看 Background 属性在何处分配了透明值。

using (var magicImage = new MagickImage())
            {
                var magicReadSettings = new MagickReadSettings
                {
                    Format = MagickFormat.Svg,
                    ColorSpace = ColorSpace.Transparent,
                    BackgroundColor = MagickColors.Transparent,
                    // increasing the Density here makes a larger and sharper output to PNG
                    Density = new Density(950, DensityUnit.PixelsPerInch)
                };

                magicImage.Read("someimage.svg", magicReadSettings);
                magicImage.Format = MagickFormat.Png;

                magicImage.Write("someimage.png");

            }

在我的例子中,我想将它发送到 UWP Image 元素,所以我没有 Write(),而是在上述步骤之后执行了以下操作:

                // Create byte array that contains a png file
                byte[] imageData = magicImage.ToByteArray();

                using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
                {
                    using (DataWriter writer = new DataWriter(stream.GetOutputStreamAt(0)))
                    {
                        writer.WriteBytes(imageData);
                        await writer.StoreAsync();
                    }

                    await bitmapImage.SetSourceAsync(stream);
                }


return bitMapImage; // new BitMapImage() was scoped before all of this

然后在 UWP Image 元素上,只需使用:

imageElement.Source = bitMapImage;

【讨论】:

    【解决方案2】:

    命令行中的大多数参数都是 MagickImage 类的属性或方法。您的命令将转换为:

    using (var img = new MagickImage("image.jpg"))
    {
        // -fuzz XX%
        img.ColorFuzz = new Percentage(10);
        // -transparent white
        img.Transparent(MagickColors.White);
        img.Write("image.png");
    }
    

    【讨论】:

    • 我不能用这种方法设置透明。背景仍然是白色的。我尝试了许多白色背景的简单png图像,但结果是一样的。我使用的版本是Magick.NET-Q16-AnyCPU
    • 我使用了这段代码,但它也削减了原始图像的中间。例如,假设图像中有一个人穿着条纹衬衫(黑色和白色),背景为白色。白色 T 恤酒吧也被称为背景并剪掉它们。
    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2012-06-26
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多