如何制作循环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
相关产品推荐
相关产品推荐

