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

如何将PNG格式图像转换为GIF格式 支持JavaScript或C#实现

Base64 PNG转Base64 GIF实现方案(JavaScript/C#)

核心转换逻辑通用:先将PNG格式的Base64解码为原始图像二进制数据,编码为GIF格式后再转成Base64字符串即可。


一、JavaScript 实现方案

1. 浏览器端实现

依赖本地引入的gif.js编码库,无需服务端交互

  • 操作步骤:
    • 将输入的PNG Base64字符串加载为Image对象
    • 初始化GIF编码器,把加载完成的PNG作为唯一帧添加到编码器
    • 监听编码完成事件,将输出的GIF Blob对象转成Base64字符串
  • 示例代码:
// 入参pngBase64为原始PNG的Base64字符串
function pngBase64ToGifBase64(pngBase64, quality = 10) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => {
      const gif = new GIF({
        workers: 2,
        quality: quality,
        width: img.width,
        height: img.height
      });
      // 添加单帧静态图,delay设为0不影响显示
      gif.addFrame(img, {delay: 0});
      gif.on('finished', (blob) => {
        const reader = new FileReader();
        reader.readAsDataURL(blob);
        reader.onloadend = () => resolve(reader.result);
      });
      gif.render();
    };
    img.onerror = reject;
    img.src = pngBase64;
  })
}

如果需要生成动态GIF,可按需求添加多帧并设置对应帧间隔即可

2. Node.js 端实现

依赖sharp图像处理库

  • 操作步骤:
    • 移除PNG Base64的前缀标识,解码为Buffer二进制对象
    • 调用sharp的格式转换方法,将PNG Buffer转为GIF Buffer
    • 把GIF Buffer编码为Base64,拼接GIF格式前缀即可
  • 示例代码:
const sharp = require('sharp');

async function pngBase64ToGifBase64(pngBase64) {
  const pngBuffer = Buffer.from(pngBase64.replace(/^data:image\/png;base64,/, ''), 'base64');
  const gifBuffer = await sharp(pngBuffer).gif().toBuffer();
  return `data:image/gif;base64,${gifBuffer.toString('base64')}`;
}

二、C# 实现方案

1. .NET Core / .NET 5+ 跨平台实现

依赖NuGet包SixLabors.ImageSharp,无系统GDI依赖

  • 操作步骤:
    • 移除PNG Base64前缀,解码为字节数组
    • 用ImageSharp加载PNG字节数组,指定GIF编码器输出到内存流
    • 读取内存流的字节数组,编码为Base64后拼接格式前缀
  • 示例代码:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Gif;

public static string PngBase64ToGifBase64(string pngBase64)
{
    string base64Content = pngBase64.Replace("data:image/png;base64,", string.Empty);
    byte[] pngBytes = Convert.FromBase64String(base64Content);
    
    using var ms = new MemoryStream();
    using (var image = Image.Load(pngBytes))
    {
        image.Save(ms, new GifEncoder());
    }
    
    byte[] gifBytes = ms.ToArray();
    return $"data:image/gif;base64,{Convert.ToBase64String(gifBytes)}";
}

2. .NET Framework 实现

依赖原生System.Drawing程序集

  • 操作步骤:
    • 解码PNG Base64为字节数组,加载为Image对象
    • 将Image对象以GIF格式保存到内存流
    • 内存流字节数组转Base64后拼接前缀
  • 示例代码:
using System.Drawing;
using System.Drawing.Imaging;

public static string PngBase64ToGifBase64(string pngBase64)
{
    string base64Content = pngBase64.Replace("data:image/png;base64,", string.Empty);
    byte[] pngBytes = Convert.FromBase64String(base64Content);
    
    using var pngMs = new MemoryStream(pngBytes);
    using var image = Image.FromStream(pngMs);
    using var gifMs = new MemoryStream();
    
    image.Save(gifMs, ImageFormat.Gif);
    byte[] gifBytes = gifMs.ToArray();
    return $"data:image/gif;base64,{Convert.ToBase64String(gifBytes)}";
}

注意事项:

  • GIF仅支持1位透明度,原始PNG的半透明区域转换后会出现锯齿,可调整编码的量化参数优化显示效果
  • APNG动图转GIF需要单独提取每帧后按顺序写入GIF,以上示例为静态PNG转静态GIF的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:18:02