我有一个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个框架,而尺寸相同。
谢谢!
答案 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);
}
}
}
文件夹,或添加一行代码以在您希望的位置创建它。