如何在.net中创建动画gif

时间:2009-07-28 19:42:36

标签: c# .net dynamic animated-gif

有谁知道如何使用c#创建动画gif? 理想情况下,我可以控制所使用的色彩还原。

使用imagemagick(作为外部启动过程)是最佳选择吗?

7 个答案:

答案 0 :(得分:25)

有一个内置的.NET类可以编码GIF文件。 GifBitmapEncode MSDN

System.Windows.Media.Imaging.GifBitmapEncoder gEnc = new GifBitmapEncoder();

foreach (System.Drawing.Bitmap bmpImage in images)
{
    var bmp = bmpImage.GetHbitmap();
    var src = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        bmp,
        IntPtr.Zero,
        Int32Rect.Empty,
        BitmapSizeOptions.FromEmptyOptions());
    gEnc.Frames.Add(BitmapFrame.Create(src));
    DeleteObject(bmp); // recommended, handle memory leak
}
using(FileStream fs = new FileStream(path, FileMode.Create))
{
    gEnc.Save(fs);
}

答案 1 :(得分:21)

来自https://github.com/DataDink/Bumpkit的此Gif动画创建器代码可以设置Delay foreach Frame:

使用.Net标准Gif编码并添加动画标题。

编辑:使代码类似于典型的文件编写器。

$message = 'Access denied';
$checkApi = false;
if(function_exists('apache_request_headers')){
    if(apache_request_headers()['Authorization'] == '2d30ff242f8650954bfe8c993f084f4f')
        $checkApi = true;
}

答案 2 :(得分:20)

您也可以考虑使用ImageMagick库。

http://www.imagemagick.org/script/api.php

列出的库有两个.net包装器

以下是使用Magick.net wrapper

进行操作的示例
using (MagickImageCollection collection = new MagickImageCollection())
{
  // Add first image and set the animation delay to 100ms
  collection.Add("Snakeware.png");
  collection[0].AnimationDelay = 100;

  // Add second image, set the animation delay to 100ms and flip the image
  collection.Add("Snakeware.png");
  collection[1].AnimationDelay = 100;
  collection[1].Flip();

  // Optionally reduce colors
  QuantizeSettings settings = new QuantizeSettings();
  settings.Colors = 256;
  collection.Quantize(settings);

  // Optionally optimize the images (images should have the same size).
  collection.Optimize();

  // Save gif
  collection.Write("Snakeware.Animated.gif");
}

答案 3 :(得分:16)

在不知道重要的质量参数的情况下,调用imagemagick是否是最佳选择是很难的。其他一些选择是:

这些优点是您不依赖于第三个部分库,它可能在所有执行代码的系统上可用或不可用。

MS支持中的article解释了如何使用自定义颜色表保存gif(这需要完全信任)。动画gif只是每个图像的一组GIF,标题中还有一些附加信息。因此,结合这两篇文章应该可以满足您的需求。

答案 4 :(得分:1)

要使用Windows窗体应用程序中的示例,请添加对这些程序集的引用:

C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ PresentationCore.dll  C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Xaml.dll  C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ WindowsBase.dll

然后

  • Int32Rect位于System.Windows命名空间

  • BitmapSizeOptions位于System.Windows.Media.Imaging命名空间

  • BitmapFrame位于System.Windows.Media.Imaging命名空间

另外,不要忘记关闭文件流(如下所示):

using(FileStream targetFile = new FileStream(path, FileMode.Create))
{
   gEnc.Save(targetFile);
}

答案 5 :(得分:0)

我注意到ImageMagic和NGif的另一个很好的替代品还没有在答案中列出。

FFMpeg可用于从以下位置创建动画GIF:

  • 图像序列(文件)
  • 现有视频片段(例如,mp4或avi)
  • 来自C#位图对象,通过stdin提供输入数据作为“ravvideo”(不使用任何临时文件)

您可以直接从C#代码(使用System.Diagnostics.Process)启动ffmpeg.exe,也可以使用现有的.NET ffmpeg包装器之一:

var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
ffmpeg.ConvertMedia("your_clip.mp4", null, "result.gif", null, new ConvertSettings() );

(此代码示例使用免费NReco VideoConverter - 我是此组件的作者,随时可以询问有关其用法的任何问题。)

通过降低帧速率和/或帧大小可以轻松减小GIF大小。 此外,它还可以通过2遍方法获得精美的动画GIF,从而生成最佳的GIF调色板。

答案 6 :(得分:0)

AnimatedGif软件包可以制作动画gif。

using (var gif = AnimatedGif.AnimatedGif.Create(Path.Combine(outputPath, "output.gif"), 20))
{
    for (var i = 0; i < 10; i++)
    {
        img = Image.FromFile(Path.Combine(outputPath, $"{i.ToString().PadLeft(3, '0')}.png"));
        gif.AddFrame(img, delay: -1, quality: GifQuality.Bit8);
    }
}