Example #1
0
        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);
        }
Example #2
0
        /// <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());
        }
Example #3
0
        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();
        }