コード例 #1
0
        public static SixLabors.ImageSharp.Image <Rgba32> BattlefieldTest()
        {
            Console.WriteLine("whereA");
            List <Bitmap> monSpawnLeft = new List <Bitmap>();

            ImageCriteria criteria = new ImageCriteria();

            criteria.AddBack("C:\\Users\\lifei_jljypee\\Desktop\\Discomon Project\\DiscomonProject\\Assets\\UI Assets\\battlefield.jpg")
            .AddImage("C:\\Users\\lifei_jljypee\\Desktop\\Discomon Project\\DiscomonProject\\Assets\\Mon Art\\grasipup.png")
            .SetX(385)
            .SetY(420)
            .SetXWidth(420)
            .SetYHeight(420)
            .SetFlip(true)
            .SetCentralize(true);

            for (int i = 0; i < 10; i++)
            {
                if (i < 5)
                {
                    criteria.SetScale(0.2 * (i + 1));
                    monSpawnLeft.Add(MergeTwoImages(criteria));
                }
                else
                {
                    criteria.SetScale(1.0);
                    monSpawnLeft.Add(MergeTwoImages(criteria));
                }
            }

            List <Bitmap> monSpawnRight = new List <Bitmap>();

            criteria.ClearBack()
            .ClearImage()
            .AddImage("C:\\Users\\lifei_jljypee\\Desktop\\Discomon Project\\DiscomonProject\\Assets\\Mon Art\\psygoat.png")
            .SetX(1520)
            .SetFlip(false);
            for (int i = 0; i < 10; i++)
            {
                criteria.AddBack(monSpawnLeft[i]);
                if (i < 5)
                {
                    criteria.SetScale(0.2 * (i + 1));
                    monSpawnRight.Add(MergeTwoImages(criteria));
                }
                else
                {
                    criteria.SetScale(1.0);
                    monSpawnRight.Add(MergeTwoImages(criteria));
                }
            }

            List <Bitmap> leftSpawnAnim = GifOntoGif(monSpawnRight, "C:\\Users\\lifei_jljypee\\Desktop\\Discomon Project\\DiscomonProject\\Assets\\Animation Experiments\\LightBurst");

            Console.WriteLine("whereB");
            List <Bitmap> finalFrames = GifOntoGif(leftSpawnAnim, "C:\\Users\\lifei_jljypee\\Desktop\\Discomon Project\\DiscomonProject\\Assets\\Animation Experiments\\LightBurstFlipped");

            Console.WriteLine($"whereC {finalFrames.Count}");
            List <(byte[] img, int duration)> images = new List <(byte[], int)>();

            Console.WriteLine("whereD");
            int framesCount = finalFrames.Count;

            Console.WriteLine("whereE");

            foreach (Bitmap frame in finalFrames)
            {
                using (var stream = new MemoryStream())
                {
                    frame.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                    images.Add((stream.ToArray(), 10));
                }
            }

            Console.WriteLine("whereF");
            int width  = 0;
            int height = 0;

            using (var image = SixLabors.ImageSharp.Image.Load(images[0].img))
            {
                width  = image.Width;
                height = image.Height;
            }
            Console.WriteLine("whereG");

            // Create a blank canvas for the gif
            var gif = new SixLabors.ImageSharp.Image <Rgba32>(width, height);

            for (int i = 0; i < images.Count; i++)
            {
                Console.WriteLine("whereH");
                // Load image that will be added
                using (var image = SixLabors.ImageSharp.Image.Load(images[i].img))
                {
                    // Resize the image to the output dimensions
                    //image.Mutate(ctx => ctx.Resize(width, height));

                    // Set the duration of the image
                    image.Frames.RootFrame.Metadata.GetFormatMetadata(SixLabors.ImageSharp.Formats.Gif.GifFormat.Instance).FrameDelay = images[i].duration;

                    // Add the image to the gif
                    gif.Frames.InsertFrame(i, image.Frames.RootFrame);
                    Console.WriteLine($"Frame #{i} added");
                }
            }
            Console.WriteLine("whereI");

            gif.Metadata.GetFormatMetadata(SixLabors.ImageSharp.Formats.Gif.GifFormat.Instance).RepeatCount = 1;
            Console.WriteLine("whereJ");
            if (gif.Frames.Count > framesCount)
            {
                gif.Frames.RemoveFrame(gif.Frames.Count - 1);
            }
            Console.WriteLine("whereK");

            return(gif);
        }
コード例 #2
0
        public static Bitmap MergeTwoImages(ImageCriteria criteria)
        {
            //Get the background image
            Image backImage;

            if (criteria.IsBitmapBack)
            {
                backImage = criteria.BImageBack;
            }
            else
            {
                backImage = Image.FromFile(criteria.ImageBack);
            }

            //Get the overlay image
            Image overlayImage;

            if (criteria.IsBitmap)
            {
                overlayImage = criteria.BImage;
            }
            else
            {
                overlayImage = Image.FromFile(criteria.Image);
            }

            if (criteria.Flip)
            {
                overlayImage.RotateFlip(RotateFlipType.RotateNoneFlipX);
            }

            if (backImage == null)
            {
                throw new ArgumentNullException("backImage");
            }
            if (overlayImage == null)
            {
                throw new ArgumentNullException("overlayImage");
            }

            Bitmap outputImage = new Bitmap(backImage.Width, backImage.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            if (criteria.XWidth == 0)
            {
                criteria.XWidth = overlayImage.Width;
            }
            if (criteria.YHeight == 0)
            {
                criteria.YHeight = overlayImage.Height;
            }

            using (Graphics graphics = Graphics.FromImage(outputImage))
            {
                graphics.DrawImage(backImage, new Rectangle(new Point(), backImage.Size),
                                   new Rectangle(new Point(), backImage.Size), GraphicsUnit.Pixel);
                graphics.DrawImage(overlayImage, new Rectangle(criteria.GetXLoc(), criteria.GetYLoc(), criteria.GetXSize(), criteria.GetYSize()),
                                   new Rectangle(new Point(), overlayImage.Size), GraphicsUnit.Pixel);
            }

            return(outputImage);
        }