有谁知道如何使用c#创建动画gif? 理想情况下,我可以控制所使用的色彩还原。
使用imagemagick(作为外部启动过程)是最佳选择吗?
答案 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:
您可以直接从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);
}
}