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

如何制作循环GIF?现有代码添加标签后仅重复30次即停止

实现无限循环的带标签GIF

你的代码目前是通过重复30次添加所有帧来模拟循环,这会让GIF体积大幅增加,且不是标准的GIF循环控制方式。要制作真正的循环GIF,只需设置GifBitmapEncoder的RepeatCount属性即可,无需重复添加帧。

修改要点:

  • 移除外层的s < 30循环,避免重复添加帧
  • 设置gEnc.RepeatCount = 0;(0表示无限循环,若需固定次数,可设置对应数值,比如设为29则总播放30次)
  • 补充资源释放代码,避免内存泄漏

完整修改后的代码:

string originalImgPath = @"..\35.gif";
using (System.Drawing.Image IMG = System.Drawing.Image.FromFile(originalImgPath))
{
    FrameDimension dimension = new FrameDimension(IMG.FrameDimensionsList[0]);
    int frameCount = IMG.GetFrameCount(dimension);
    GifBitmapEncoder gEnc = new GifBitmapEncoder();
    
    // 设置无限循环(0为无限,n则循环n次,总播放n+1次)
    gEnc.RepeatCount = 0;

    for (int i = 0; i < frameCount; i++)
    {
        IMG.SelectActiveFrame(dimension, i);
        using (var aFrame = new Bitmap(IMG))
        using (Graphics graphics = Graphics.FromImage(aFrame))
        {
            // 绘制标签背景和文字
            graphics.FillRectangle(Brushes.White, new Rectangle(aFrame.Width / 6, aFrame.Height - 50, Convert.ToInt32(aFrame.Width / 1.5), aFrame.Height / 4));
            graphics.DrawString("\tWelcome\n Andrezila!!", new System.Drawing.Font("Arial", 14, System.Drawing.FontStyle.Bold), System.Drawing.Brushes.Black, Convert.ToInt32(aFrame.Width / 1.3), aFrame.Height - 50);

            var bmp = aFrame.GetHbitmap();
            try
            {
                var src = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    bmp,
                    IntPtr.Zero,
                    System.Windows.Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());

                gEnc.Frames.Add(BitmapFrame.Create(src));
            }
            finally
            {
                // 释放HBitmap资源
                DeleteObject(bmp);
            }
        }
    }

    string saveImgFile = @"..\tenor-304976776.gif";
    using (FileStream fs2 = new FileStream(saveImgFile, FileMode.Create))
    {
        gEnc.Save(fs2);
    }
}

// 需要引入的API用于释放HBitmap
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);

说明:

  • RepeatCount属性:0代表无限循环,设置为N则GIF会重复N次,总播放次数为N+1次
  • 使用using语句包裹Image、Bitmap、Graphics等资源,确保自动释放
  • 添加DeleteObject调用释放GetHbitmap()创建的GDI资源,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:40:54