WebP is an image format developed by Google Inc. This format provides lossless and lossy compression for images on the web. WebP can be used for animated images as an alternative to the popular GIF format.
Graphics Mill allows working with WebP images as a whole or with each image frame separately. There are two main classes to deal with WebP files: Codecs.WebPReader and Codecs.WebPWriter. For more information about format readers and writers see the Working with Files topic.
This topic contains the following sections:
You can read a WebP image from a file or a stream by using the appropriate WebPReader constructor. After the image is opened use the WebPReader.Frames property to get access to an image frame or to iterate through all frames in the image.
The following code reads a WebP image and saves its frames as separate PNG files:
using (var reader = new WebPReader(@"Images\AnimatedWebP.webp")) { for (int i = 0; i < reader.Frames.Count; i++) { reader.Frames[i].GetBitmap().Save(@"Images\Output\WebP_frame_" + i.ToString() + ".png"); } }
To write a WebP image to a file or a stream use the appropriate WebPWriter constructor. The WebPWriter properties allows specifying the general WebP image settings, such as playback count, image optimization, etc.
Any bitmap having WebP-supported pixel format can be a frame of a WebP image. You can check if the pixel format is supported either by using the table or via the IsPixelFormatSupported(PixelFormat) method. To add a frame to the writer, run a pipeline by calling the Pipeline.Run method. If you are not familiar with pipelines, read the Understanding Image Processing Approaches in Graphics Mill topic.
The following code creates an animated WebP image from separate bitmaps:
using (var writer = new WebPWriter(@"Images\Output\AnimatedWebP.webp")) { writer.FrameOptions.Delay = 250; for (int i = 0; i < 400; i += 25) { var bitmap = new Bitmap(400, 100, PixelFormat.Format24bppRgb, RgbColor.Yellow); using (var graphics = bitmap.GetAdvancedGraphics()) { graphics.FillEllipse(new SolidBrush(RgbColor.Green), new System.Drawing.RectangleF(i, 0, 100, 100)); } Pipeline.Run(bitmap + writer); } }
To resize an animated WebP file you should resize each of its frames separately. So you need to perform the following steps:
The following code resizes an input WebP image to half of original width and height.
using (var reader = new WebPReader(@"Images\AnimatedWebP.webp")) using (var writer = new WebPWriter(@"Images\Output\AnimatedWebP1.webp")) { //Copy general properties of the source file writer.BackgroundColor = reader.BackgroundColor; writer.PlaybackCount = reader.PlaybackCount; for (int i = 0; i < reader.Frames.Count; i++) { //Read a frame using (var frame = reader.Frames[i]) using (var bitmap = frame.GetBitmap()) { //Preserve the original palette ColorPalette palette = bitmap.Palette; //Preserve the original pixel format PixelFormat pixelFormat = bitmap.PixelFormat; //Convert the bitmap to a non-indexed format bitmap.ColorManagement.Convert(ColorSpace.Rgb, true, false); //Resize the bitmap in a high quality mode bitmap.Transforms.Resize(frame.Width / 2, frame.Height / 2, ResizeInterpolationMode.High); //Return to the indexed format bitmap.Palette = palette; bitmap.ColorManagement.Convert(pixelFormat); //Copy frame delay writer.FrameOptions.Delay = frame.Delay; //Add the frame Pipeline.Run(bitmap + writer); } } }