Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GIF到PNG:仅提取第一帧_C#_Animated Gif_System.drawing.imaging - Fatal编程技术网

C# GIF到PNG:仅提取第一帧

C# GIF到PNG:仅提取第一帧,c#,animated-gif,system.drawing.imaging,C#,Animated Gif,System.drawing.imaging,我试图在我的c#程序中提取动画gif的各个帧 它为每一帧创建一个png,效果很好,但是它们只是第一帧的一堆副本。 我做错了什么 Image img = Image.FromFile(path); FrameDimension dimension = new FrameDimension(img.FrameDimensionsList[0]); int frameCount = img.GetFrameCount(dimension); MemoryStream memory = new Memo

我试图在我的c#程序中提取动画gif的各个帧

它为每一帧创建一个png,效果很好,但是它们只是第一帧的一堆副本。 我做错了什么

Image img = Image.FromFile(path);
FrameDimension dimension = new FrameDimension(img.FrameDimensionsList[0]);
int frameCount = img.GetFrameCount(dimension);
MemoryStream memory = new MemoryStream();
for(int i = 0; i < frameCount; i++){
    img.SelectActiveFrame(dimension, i);
    ((Image)img.Clone).Save(memory, System.Drawing.Imaging.ImageFormat.Png);
    File.WriteAllBytes(myFolder + "/frame_"+i+".png", memory.ToArray());
}

有人能给我解释一下,为什么这个代码有效而原始代码无效?
非常感谢

我认为主要的问题是,您正在写入同一个内存流,而没有重置它。因此,您可以有效地将以前提取的所有文件的内容写入每个新帧。对于每个图像,只有第一帧可见

您必须为每个图像分配一个新的内存流,而不是一开始就分配

for(int i = 0; i < frameCount; i++)
{
    img.SelectActiveFrame(dimension, i);
    var outputPath = myFolder + "/frame_"+i+".png";
    using (var memory = new MemoryStream())
    {
        img.Save(memory, ImageFormat.Png); // cloning is not necessary
        File.WriteAllBytes(outputPath, memory.ToArray());
    }
}
for(int i = 0; i < frameCount; i++)
{
    img.SelectActiveFrame(dimension, i);
    var outputPath = myFolder + "/frame_"+i+".png";
    using (var memory = new MemoryStream())
    {
        img.Save(memory, ImageFormat.Png); // cloning is not necessary
        File.WriteAllBytes(outputPath, memory.ToArray());
    }
}
var path = ...;
var dir = ...;
using (var img = Image.FromFile(path))
{
    var dimension = new FrameDimension(img.FrameDimensionsList.First());
    var frameCount = img.GetFrameCount(dimension);
    foreach (var i in Enumerable.Range(0, frameCount))
    {
        img.SelectActiveFrame(dimension, i);
        var outputFile = Path.Combine(dir, $"frame_{i:00}.png");
        img.Save(outputFile, ImageFormat.Png);
    }
}