如何在C# WPF中使图像(徽标)的背景透明?

xhv8bpkk  于 2023-03-19  发布在  C#
关注(0)|答案(2)|浏览(295)

我有一个图像(徽标),我想通过它作为一个参数,使背景透明,然后保存它。
我怎样才能做到这一点?
我试过了:

public string SaveImage(Bitmap bmp,string SavePath,string Name)
    {
        string path = "";
        var format = ImageFormat.Jpeg;
        using (var m = new MemoryStream())
        {
            bmp.Save(m, format);

            var img = System.Drawing.Image.FromStream(m);

            using (var g = Graphics.FromImage(img)) // This is what I've used for making the background transparent 
            {
                g.Clear(System.Drawing.Color.Transparent);
                g.Save();
            }
            var ImgPath = Path.Combine(SavePath, Path.ChangeExtension(Name,"png"));

            img.Save(ImgPath);
            path = ImgPath;

        }

        return path;
    }

测试此功能后,我得到一个黑色图像作为输出(保存图像)

z5btuh9x

z5btuh9x1#

代码的一些注解:

  • 使用System.Drawing类型 Package 本机GDI+组件,而不是WPF。
  • 使用JPEG编码器保存Bitmap,但JPEG编码器不支持透明,即使徽标具有透明背景,JPEG编码器也会将其删除
  • 现在重新加载保存的图像并使用透明色清除全部内容(这也不起作用,因为重新加载的JPEG图像将具有24位RGB像素格式,没有alpha支持,因此整个图像将为黑色)

可能的解决办法:

  • 使用PNG编码器,它支持透明。如果徽标有一个透明的背景,你甚至不需要其他任何东西。
  • 如果徽标最初不是透明的,请使用MakeTransparent方法代替Clear。它将替换单色,因此无法恢复可能的抗锯齿Alpha混合。它还将转换像素格式,以便也可以在重新加载的JPEG上使用。
  • 要在WPF中执行相同操作,您可以使用this库(免责声明:您可以在WriteableBitmap上使用GetReadWriteBitmapData扩展方法来访问与上面相同的MakeTransparent功能沿着某种other features。但是,如果您知道如何分离混合颜色,则要恢复良好的抗锯齿alpha背景,您可能需要使用TransformColors方法。
tktrz96b

tktrz96b2#

通过下面的代码更改背景颜色

using (var ms = new MemoryStream((byte[])(bits)))
                        {
                            var image = System.Drawing.Image.FromStream(ms);
                            
                            using (var b = new Bitmap(image.Width, image.Height))
                            {
                                b.SetResolution(image.HorizontalResolution, image.VerticalResolution);

                                using (var g = Graphics.FromImage(b))
                                {
                                    g.Clear(Color.Transparent);
                                    g.DrawImageUnscaled(image, 0, 0);
                                }
                                // Encoder parameter for image quality
                                EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L);
                                // Jpeg image codec
                                ImageCodecInfo imgcodec = GetEncoderInfo("image/" + ImageFormat.Png.ToString().ToLower());

                                EncoderParameters encoderParams = new EncoderParameters(1);
                                encoderParams.Param[0] = qualityParam;
                                b.Save(target, imgcodec, encoderParams);
                            }
                        }

相关问题