// WIN32 API const int LOGPIXELSY = 90; [DllImport("gdi32")] extern static int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("kernel32")] extern static int MulDiv(int nNumber, int nNumerator, int nDenominator); void AnimatedGIFExample() { // The GIF file will contain 4 frames const int frameCount = 4; // Each frame is 128 by 128 pixels (the GIF file will have double that size) const int frameWidth = 128; const int frameHeight = 128; // Background colors RasterColor[] backColor = { new RasterColor(0xFF, 0x00, 0x00), new RasterColor(0x00, 0xFF, 0x00), new RasterColor(0x00, 0x00, 0xFF), new RasterColor(0xFF, 0xFF, 0x00) }; // Foreground colors RasterColor[] foreColor = { new RasterColor(0xFF, 0xFF, 0x00), new RasterColor(0xFF, 0x00, 0x00), new RasterColor(0x00, 0xFF, 0x00), new RasterColor(0xFF, 0x00, 0x00) }; // Delay in milliseconds int[] delay = { 1000, 1000, 1000, 1000 }; // Left and top, we want the frames to move to each corner Point[] offset = { new Point(0, 0), new Point(frameWidth, 0), new Point(frameWidth, frameHeight), new Point(0, frameHeight), }; RasterImageAnimationDisposalMethod[] disposalMethod = { RasterImageAnimationDisposalMethod.RestoreBackground, RasterImageAnimationDisposalMethod.RestoreBackground, RasterImageAnimationDisposalMethod.RestoreBackground, RasterImageAnimationDisposalMethod.RestoreBackground }; RasterColor backgroundColor = RasterColor.FromGdiPlusColor(Color.Yellow); RasterImage image = null; Font font = null; StringFormat stringFormat = null; // Create the frames for(int frame = 0; frame < frameCount; frame++) { RasterImage frameImage = new RasterImage( RasterMemoryFlags.Conventional, frameWidth, frameHeight, 24, RasterByteOrder.Bgr, RasterViewPerspective.BottomLeft, null, IntPtr.Zero, 0); // Set the frame properties frameImage.AnimationDelay = delay[frame]; frameImage.AnimationOffset = offset[frame]; frameImage.AnimationDisposalMethod = disposalMethod[frame]; // Background is white frameImage.AnimationBackground = backgroundColor; // Draw the number of the frame on its surface IntPtr hdc = frameImage.CreateLeadDC(); Graphics g = Graphics.FromHdc(hdc); Rectangle rc = new Rectangle(0, 0, frameWidth, frameHeight); Brush brush = new SolidBrush(backColor[frame].ToGdiPlusColor()); g.FillRectangle(brush, rc); brush.Dispose(); if(font == null) { int fontHeight = MulDiv(72, GetDeviceCaps(hdc, LOGPIXELSY), 72); font = new Font("Consolas", fontHeight); stringFormat = new StringFormat(); stringFormat.Alignment = StringAlignment.Center; stringFormat.LineAlignment = StringAlignment.Center; } string str = string.Format("{0}", frame + 1); brush = new SolidBrush(foreColor[frame].ToGdiPlusColor()); g.DrawString(str, font, brush, rc, stringFormat); brush.Dispose(); g.Dispose(); RasterImage.DeleteLeadDC(hdc); if(image == null) image = frameImage; else image.AddPage(frameImage); } font.Dispose(); stringFormat.Dispose(); // Setup the global image properties image.AnimationGlobalSize = new Size(frameWidth * 2, frameHeight * 2); image.AnimationGlobalLoop = 0; image.AnimationGlobalBackground = backgroundColor; // Convert this image to 8 bits/pixel ColorResolutionCommand cmd = new ColorResolutionCommand( ColorResolutionCommandMode.AllPages, 8, RasterByteOrder.Rgb, RasterDitheringMethod.None, ColorResolutionCommandPaletteFlags.Optimized, null); cmd.Run(image); RasterCodecs.Startup(); RasterCodecs codecs = new RasterCodecs(); // Setup the GIF save options RasterColor[] animationPalette = image.GetPalette(); codecs.Options.Gif.Save.SetAnimationPalette(animationPalette); codecs.Options.Gif.Save.UseAnimationPalette = true; // The GIF Animation width & height, loop and background are // pulled automatically from the image // Save the file string fileName = LeadtoolsExamples.Common.ImagesPath.Path + "AnimatedGifFile.gif"; codecs.Save(image, fileName, RasterImageFormat.Gif, 8, 1, image.PageCount, 1, CodecsSavePageMode.Overwrite); image.Dispose(); codecs.Dispose(); RasterCodecs.Shutdown(); } |