コード例 #1
0
        public static void ConvertR8ToPng(string[] args)
        {
            var srcImage    = new R8Reader(File.OpenRead(args[1]));
            var shadowIndex = new int[] { };

            if (args.Contains("--noshadow"))
            {
                Array.Resize(ref shadowIndex, shadowIndex.Length + 1);
                shadowIndex[shadowIndex.Length - 1] = 3;
            }

            var palette    = Palette.Load(args[2], shadowIndex);
            var startFrame = int.Parse(args[3]);
            var endFrame   = int.Parse(args[4]) + 1;
            var filename   = args[5];
            var frameCount = endFrame - startFrame;

            var frame  = srcImage[startFrame];
            var bitmap = new Bitmap(frame.FrameSize.Width * frameCount, frame.FrameSize.Height, PixelFormat.Format8bppIndexed);

            bitmap.Palette = palette.AsSystemPalette();

            frame = srcImage[startFrame];

            if (args.Contains("--tileset"))
            {
                int f       = 0;
                var tileset = new Bitmap(frame.FrameSize.Width * 20, frame.FrameSize.Height * 40, PixelFormat.Format8bppIndexed);
                tileset.Palette = palette.AsSystemPalette();

                for (int h = 0; h < 40; h++)
                {
                    for (int w = 0; w < 20; w++)
                    {
                        if (h * 20 + w < frameCount)
                        {
                            Console.WriteLine(f);
                            frame = srcImage[f];

                            var data = tileset.LockBits(new Rectangle(w * frame.Size.Width, h * frame.Size.Height, frame.Size.Width, frame.Size.Height),
                                                        ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

                            for (var i = 0; i < frame.Size.Height; i++)
                            {
                                Marshal.Copy(frame.Image, i * frame.Size.Width,
                                             new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Size.Width);
                            }

                            tileset.UnlockBits(data);
                            f++;
                        }
                    }
                }

                bitmap = tileset;
            }

            bitmap.Save(filename + ".png");
            Console.WriteLine(filename + ".png saved");
        }
コード例 #2
0
        public static void ConvertR8ToPng(string[] args)
        {
            var srcImage    = new R8Reader(File.OpenRead(args[1]));
            var shouldRemap = args.Contains("--transparent");
            var palette     = Palette.Load(args[2], shouldRemap);
            var startFrame  = int.Parse(args[3]);
            var endFrame    = int.Parse(args[4]) + 1;
            var filename    = args[5];
            var FrameCount  = endFrame - startFrame;

            var frame  = srcImage[startFrame];
            var bitmap = new Bitmap(frame.FrameWidth * FrameCount, frame.FrameHeight, PixelFormat.Format8bppIndexed);

            bitmap.Palette = palette.AsSystemPalette();

            int OffsetX = 0;
            int OffsetY = 0;

            int x = 0;

            frame = srcImage[startFrame];

            //TODO: This is not enough as the run and shoot animation are next to each other for each sequence in RA/CnC.
            if (args.Contains("--infantry"))             //resorting to RA/CnC compatible counter-clockwise frame order
            {
                endFrame = startFrame - 1;
                for (int e = 8; e < FrameCount + 1; e = e + 8)           //assuming 8 facings each animation set
                {
                    for (int f = startFrame + e - 1; f > endFrame; f--)
                    {
                        OffsetX = frame.FrameWidth / 2 - frame.Width / 2;
                        OffsetY = frame.FrameHeight / 2 - frame.Height / 2;

                        Console.WriteLine("calculated OffsetX: {0}", OffsetX);
                        Console.WriteLine("calculated OffsetY: {0}", OffsetY);

                        var data = bitmap.LockBits(new Rectangle(x + OffsetX, 0 + OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly,
                                                   PixelFormat.Format8bppIndexed);

                        for (var i = 0; i < frame.Height; i++)
                        {
                            Marshal.Copy(frame.Image, i * frame.Width,
                                         new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width);
                        }

                        bitmap.UnlockBits(data);

                        x += frame.FrameWidth;

                        frame = srcImage[f];
                        Console.WriteLine("f: {0}", f);
                    }
                    endFrame = startFrame + e - 1;
                    frame    = srcImage[startFrame + e];
                    Console.WriteLine("e: {0}", e);
                    Console.WriteLine("FrameCount: {0}", FrameCount);
                }
            }
            else if (args.Contains("--vehicle"))             //resorting to RA/CnC compatible counter-clockwise frame order
            {
                frame = srcImage[startFrame];

                for (int f = endFrame - 1; f > startFrame - 1; f--)
                {
                    OffsetX = frame.FrameWidth / 2 - frame.OffsetX;
                    OffsetY = frame.FrameHeight / 2 - frame.OffsetY;

                    Console.WriteLine("calculated OffsetX: {0}", OffsetX);
                    Console.WriteLine("calculated OffsetY: {0}", OffsetY);

                    var data = bitmap.LockBits(new Rectangle(x + OffsetX, 0 + OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly,
                                               PixelFormat.Format8bppIndexed);

                    for (var i = 0; i < frame.Height; i++)
                    {
                        Marshal.Copy(frame.Image, i * frame.Width,
                                     new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width);
                    }

                    bitmap.UnlockBits(data);

                    x += frame.FrameWidth;

                    frame = srcImage[f];
                }
            }
            else if (args.Contains("--wall"))             //complex resorting to RA/CnC compatible frame order
            {
                int[] D2kBrikFrameOrder = { 1, 4, 2, 12, 5, 6, 16, 9, 3, 13, 7, 8, 14, 10, 11, 15, 17, 20, 18, 28, 21, 22, 32, 25, 19, 29, 23, 24, 30, 26, 27, 31 };
                foreach (int o in D2kBrikFrameOrder)
                {
                    int f = startFrame - 1 + o;

                    frame = srcImage[f];

                    if (frame.OffsetX < 0)
                    {
                        frame.OffsetX = 0 - frame.OffsetX;
                    }
                    if (frame.OffsetY < 0)
                    {
                        frame.OffsetY = 0 - frame.OffsetY;
                    }
                    OffsetX = 0 + frame.OffsetX;
                    OffsetY = frame.FrameHeight - frame.OffsetY;
                    Console.WriteLine("calculated OffsetX: {0}", OffsetX);
                    Console.WriteLine("calculated OffsetY: {0}", OffsetY);

                    var data = bitmap.LockBits(new Rectangle(x + OffsetX, 0 + OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly,
                                               PixelFormat.Format8bppIndexed);

                    for (var i = 0; i < frame.Height; i++)
                    {
                        Marshal.Copy(frame.Image, i * frame.Width,
                                     new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width);
                    }

                    bitmap.UnlockBits(data);

                    x += frame.FrameWidth;
                }
            }
            else if (args.Contains("--tileset"))
            {
                int f       = 0;
                var tileset = new Bitmap(frame.FrameWidth * 20, frame.FrameHeight * 40, PixelFormat.Format8bppIndexed);
                tileset.Palette = palette.AsSystemPalette();

                for (int h = 0; h < 40; h++)
                {
                    for (int w = 0; w < 20; w++)
                    {
                        if (h * 20 + w < FrameCount)
                        {
                            Console.WriteLine(f);
                            frame = srcImage[f];

                            var data = tileset.LockBits(new Rectangle(w * frame.Width, h * frame.Height, frame.Width, frame.Height),
                                                        ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

                            for (var i = 0; i < frame.Height; i++)
                            {
                                Marshal.Copy(frame.Image, i * frame.Width,
                                             new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width);
                            }

                            tileset.UnlockBits(data);
                            f++;
                        }
                    }
                }
                bitmap = tileset;
            }
            else
            {
                for (int f = startFrame; f < endFrame; f++)
                {
                    frame = srcImage[f];
                    if (args.Contains("--infantrydeath"))
                    {
                        OffsetX = frame.FrameWidth / 2 - frame.Width / 2;
                        OffsetY = frame.FrameHeight / 2 - frame.Height / 2;
                    }
                    else if (args.Contains("--projectile"))
                    {
                        OffsetX = frame.FrameWidth / 2 - frame.OffsetX;
                        OffsetY = frame.FrameHeight / 2 - frame.OffsetY;
                    }
                    else if (args.Contains("--building"))
                    {
                        if (frame.OffsetX < 0)
                        {
                            frame.OffsetX = 0 - frame.OffsetX;
                        }
                        if (frame.OffsetY < 0)
                        {
                            frame.OffsetY = 0 - frame.OffsetY;
                        }
                        OffsetX = 0 + frame.OffsetX;
                        OffsetY = frame.FrameHeight - frame.OffsetY;
                    }
                    Console.WriteLine("calculated OffsetX: {0}", OffsetX);
                    Console.WriteLine("calculated OffsetY: {0}", OffsetY);

                    var data = bitmap.LockBits(new Rectangle(x + OffsetX, 0 + OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly,
                                               PixelFormat.Format8bppIndexed);

                    for (var i = 0; i < frame.Height; i++)
                    {
                        Marshal.Copy(frame.Image, i * frame.Width,
                                     new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width);
                    }

                    bitmap.UnlockBits(data);

                    x += frame.FrameWidth;
                }
            }
            bitmap.Save(filename + ".png");
            Console.WriteLine(filename + ".png saved");
        }