You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存无背景色的PNG图片?C#代码存出异常背景问题

解决C#保存透明背景PNG的问题

要让生成的PNG真正带有透明背景,需要确保Bitmap的Alpha通道被正确初始化和保存,以下是修改后的代码及关键说明:

关键修改点

  • 保留g.Clear(Color.Transparent)初始化透明背景
  • 设置Graphics合成模式,确保绘制时不破坏透明通道
  • 明确使用PNG编码器参数保存Alpha通道

修改后的完整代码

private void SaveColorsAsBitmap(List<ColorItem> colors, string filePath)
{
    int widthColorBlock = 39; // 颜色块宽度
    int heightColorBlock = 18; // 颜色块高度

    int imageHeight = 377; // 结果图片高度
    int imageWidth = 106;  // 结果图片宽度

    var startDrawColorsPoint = new Point(45, 38); // 颜色绘制起始坐标

    var borderThickness = 1;  // 颜色块边框厚度(像素)

    using (Bitmap bitmap = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb))
    {
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            // 初始化背景为完全透明
            g.Clear(Color.Transparent);
            // 设置合成模式,确保在透明背景上叠加绘制
            g.CompositingMode = CompositingMode.SourceOver;
            g.CompositingQuality = CompositingQuality.HighQuality;

            for (int i = 0; i < colors.Count; i++)
            {
                using (SolidBrush brush = new SolidBrush(colors[i].color))
                {
                    // 计算颜色块位置和尺寸
                    var colorBlockPositionX = startDrawColorsPoint.X + borderThickness;
                    var colorBlockPositionY = startDrawColorsPoint.Y + (heightColorBlock * i) + borderThickness;
                    var colorBlockWidth = widthColorBlock - (borderThickness * 2);
                    var colorBlockHeight = heightColorBlock - borderThickness;

                    g.FillRectangle(brush, colorBlockPositionX, colorBlockPositionY, colorBlockWidth, colorBlockHeight);
                }
            }
        }

        // 获取PNG编码器,确保保存Alpha通道
        ImageCodecInfo pngCodec = ImageCodecInfo.GetImageEncoders()
            .FirstOrDefault(codec => codec.FormatID == ImageFormat.Png.Guid);
        if (pngCodec != null)
        {
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(Encoder.Transparency, 1L);
            bitmap.Save(filePath, pngCodec, encoderParams);
        }
        else
        {
            // 备用保存方式,默认PNG格式
            bitmap.Save(filePath, ImageFormat.Png);
        }
    }
}

额外说明

  • 部分看图软件(比如Windows自带画图)会默认用白色填充透明区域,但图片本身的透明通道是正常的,可通过Photoshop、GIMP等专业软件验证透明效果。
  • 必须使用PixelFormat.Format32bppArgb格式,该格式包含8位Alpha通道,是实现透明效果的基础。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:55:36