如何将gif转换为多个Spritesheets?

时间:2018-07-08 23:21:28

标签: c# gif

我有一个gif,我想将其转换为每帧具有相同大小的多个Spritesheet。

以下代码将我的gif转换为包含每个帧的许多png文件:

public static Image[] framesFromGIF(Image IMG)
{
    List<Image> IMGs = new List<Image>();
    int Length = IMG.GetFrameCount(FrameDimension.Time);

    for (int i = 0; i < Length; i++)
    {
        IMG.SelectActiveFrame(FrameDimension.Time, i);
        IMGs.Add(new Bitmap(IMG));
    }

    return IMGs.ToArray();
}

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\myGif.gif";
Image gifImg = Image.FromFile(path);
FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]);
// Number of frames
int frameCount = gifImg.GetFrameCount(dimension);
ToOutput("Number of Frames: " + frameCount.ToString());
ToOutput("Height: " + gifImg.Height + "px, " + "Width: " + gifImg.Width + "px.");
for (int i = 1; i <= framesFromGIF(gifImg).Length; i++) {
    framesFromGIF(gifImg)[i].Save("F" + i.ToString() + "_myGif.png", ImageFormat.Png);
}

此链接包含原始gif。 https://cdn.discordapp.com/attachments/435156455272873994/465576709110890497/Bulbasaur.gif

此png是我要创建的理想png图纸之一。 https://cdn.discordapp.com/attachments/435156455272873994/465576801750482944/Bulbasaur-0.png

我希望能够有多个这样的png工作表,同时仍保持所有这些工作表的统一大小。例如,一张Spritesheet可以具有40个框架,而一个Spritesheet可以具有10个框架,而尺寸相同。

谢谢!

2 个答案:

答案 0 :(得分:0)

可以通过将Bitmap初始化为所需大小来创建新图像。然后,您可以使用Graphics将源图像复制到组合图像中的下一个位置。

private Image combineFrames(Image[] images, int columns) {
    int rows = (int) Math.Ceiling((double) images.Length / columns);

    using (Bitmap bitmap = new Bitmap(images[0].Width * columns, images[0].Height * rows) {
        using (Graphics graphics = Graphics.FromImage(bitmap)) {
            for (int i = 0; i < images.Length; ++i) {
                Image image = images[i];

                graphics.DrawImage(
                    image,
                    image.Width * (i % columns),
                    image.Height * (int) ((double) i / columns)
                ); 
            }
        }
    }
}

答案 1 :(得分:0)

使用System.Windows.Media.Imaging BitmapDecoder / BitmapEncoder类的解决方案可用于源框架。

首先,使用import numpy as np array_txt = np.loadtxt( "C:\Vikalp\Learning\Machine Learning\Practice\carstopping.txt", usecols=(0, 1), delimiter=',' ) 打开并解码Gif图像文件流,然后将每个帧传递到PngBitmapEncoder并另存为PNG图像。

一个逐行编号被添加到每个框架文件。

BitmapDecoder.Create(SourceStream)

注意:
您需要预先在桌面上创建 using System.IO; using System.Windows.Media.Imaging; int CurrentFrame = 0; string SourceFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "myGif.gif"); string FramesDestinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "myGif-Frames"); using (FileStream SourceStream = new FileStream(SourceFile, FileMode.Open, FileAccess.Read, FileShare.None)) { var bitmapDecoder = BitmapDecoder.Create(SourceStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); foreach (BitmapFrame frame in bitmapDecoder.Frames) { ++CurrentFrame; using (FileStream PngStream = new FileStream(FramesDestinationPath + $@"\frame{CurrentFrame}.png", FileMode.Create, FileAccess.Write, FileShare.None)) { PngBitmapEncoder PngEncoder = new PngBitmapEncoder(); PngEncoder.Frames.Add(frame); PngEncoder.Save(PngStream); } } } 文件夹,或添加一行代码以在您希望的位置创建它。