static FFUFile ReadFile(FileInfo file) { FFUFile ffu = new FFUFile(); using (FileStream reader = file.OpenRead()) { using (BinaryReader binReader = new BinaryReader(reader)) { reader.Seek(4, SeekOrigin.Begin); ffu.WordCount = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(0x10, SeekOrigin.Begin); ffu.EndOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(0x18, SeekOrigin.Begin); ffu.ConfigOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); ffu.ImageOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(ffu.ImageOffset, SeekOrigin.Begin); ffu.ImageData = new byte[ffu.ImageLength]; reader.Read(ffu.ImageData, 0, ffu.ImageLength); } } return(ffu); }
/// <summary> /// 读取控制文件并建立控制数据列表 /// </summary> /// <param name="file"></param> /// <returns></returns> static Config[] FillConfig(FileInfo file, FFUFile ffu) { List <Config> cfgs = new List <Config>(); using (FileStream reader = file.OpenRead()) { using (BinaryReader binReader = new BinaryReader(reader)) { reader.Seek(ffu.ConfigOffset, SeekOrigin.Begin); for (int i = 0; i < ffu.WordCount; i++) { Config cfg = new Config { Width = binReader.ReadByte(), Height = binReader.ReadByte(), Length = DataConverter.BigEndian.GetUInt16(binReader.ReadBytes(2), 0), Offset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0) }; cfgs.Add(cfg); } } } return(cfgs.ToArray()); }
static void Main(string[] args) { if (args.Length != 4) { PrintUsage(); return; } FileInfo file = new FileInfo(args[0]); if (!file.Exists) { Console.WriteLine("指定的文件不存在"); return; } string outputName = args[1]; FFUFile ffu = ReadFile(file); Config[] cfgs = FillConfig(file, ffu); int outputWidth = int.Parse(args[2]); int outputHeight = int.Parse(args[3]); //建立一张大图 Bitmap bmp = new Bitmap(outputWidth, outputHeight, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bmp); //设定绘制参数 int lineMaxHeight = 0, currentX = 0, currentY = 0; //循环控制参数来绘制图片 foreach (var config in cfgs) { lineMaxHeight = config.Height > lineMaxHeight ? config.Height : lineMaxHeight; //计算是否需要换行 if ((currentX + config.Width) > outputWidth) { currentY += lineMaxHeight; lineMaxHeight = 0; currentX = 0; } //开始绘制 MemoryStream img = FontBmp(ffu.ImageData, config.Offset, config.Length, config.Width, config.Height); g.DrawImage(Image.FromStream(img), currentX, currentY); img.Dispose(); currentX += config.Width; } //绘制完成保存图片 Bitmap reduce = BitmapToGrayscale4bpp(bmp); reduce.Save(outputName, ImageFormat.Bmp); bmp.Dispose(); reduce.Dispose(); Console.WriteLine("处理完成,请按任意键退出"); Console.ReadKey(); }
static FFUFile ReadFile(FileInfo file) { FFUFile ffu = new FFUFile(); using (FileStream reader = file.OpenRead()) { using (BinaryReader binReader = new BinaryReader(reader)) { reader.Seek(4, SeekOrigin.Begin); ffu.WordCount = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(0x10, SeekOrigin.Begin); ffu.EndOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(0x18, SeekOrigin.Begin); ffu.ConfigOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); ffu.ImageOffset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0); reader.Seek(ffu.ImageOffset, SeekOrigin.Begin); ffu.ImageData = new byte[ffu.ImageLength]; reader.Read(ffu.ImageData, 0, ffu.ImageLength); } } return ffu; }
/// <summary> /// 读取控制文件并建立控制数据列表 /// </summary> /// <param name="file"></param> /// <returns></returns> static Config[] FillConfig(FileInfo file, FFUFile ffu) { List<Config> cfgs = new List<Config>(); using (FileStream reader = file.OpenRead()) { using (BinaryReader binReader = new BinaryReader(reader)) { reader.Seek(ffu.ConfigOffset, SeekOrigin.Begin); for (int i = 0; i < ffu.WordCount; i++) { Config cfg = new Config { Width = binReader.ReadByte(), Height = binReader.ReadByte(), Length = DataConverter.BigEndian.GetUInt16(binReader.ReadBytes(2), 0), Offset = DataConverter.BigEndian.GetInt32(binReader.ReadBytes(4), 0) }; cfgs.Add(cfg); } } } return cfgs.ToArray(); }