//! # GIF en- and decoding library [![Build Status](https://github.com/image-rs/image-gif/workflows/Rust%20CI/badge.svg)](https://github.com/image-rs/image-gif/actions) //! //! GIF en- and decoder written in Rust ([API Documentation](https://docs.rs/gif)). //! //! # GIF encoding and decoding library //! //! This library provides all functions necessary to de- and encode GIF files. //! //! ## High level interface //! //! The high level interface consists of the two types //! [`Encoder`](struct.Encoder.html) and [`Decoder`](struct.Decoder.html). //! //! ### Decoding GIF files //! //! ```rust //! // Open the file //! use std::fs::File; //! let mut decoder = gif::DecodeOptions::new(); //! // Configure the decoder such that it will expand the image to RGBA. //! decoder.set_color_output(gif::ColorOutput::RGBA); //! // Read the file header //! let file = File::open("tests/samples/sample_1.gif").unwrap(); //! let mut decoder = decoder.read_info(file).unwrap(); //! while let Some(frame) = decoder.read_next_frame().unwrap() { //! // Process every frame //! } //! ``` //! //! //! //! ### Encoding GIF files //! //! The encoder can be used so save simple computer generated images: //! //! ```rust //! use gif::{Frame, Encoder, Repeat}; //! use std::fs::File; //! use std::borrow::Cow; //! //! let color_map = &[0xFF, 0xFF, 0xFF, 0, 0, 0]; //! let (width, height) = (6, 6); //! let mut beacon_states = [[ //! 0, 0, 0, 0, 0, 0, //! 0, 1, 1, 0, 0, 0, //! 0, 1, 1, 0, 0, 0, //! 0, 0, 0, 1, 1, 0, //! 0, 0, 0, 1, 1, 0, //! 0, 0, 0, 0, 0, 0, //! ], [ //! 0, 0, 0, 0, 0, 0, //! 0, 1, 1, 0, 0, 0, //! 0, 1, 0, 0, 0, 0, //! 0, 0, 0, 0, 1, 0, //! 0, 0, 0, 1, 1, 0, //! 0, 0, 0, 0, 0, 0, //! ]]; //! let mut image = File::create("tests/samples/beacon.gif").unwrap();; //! let mut encoder = Encoder::new(&mut image, width, height, color_map).unwrap(); //! encoder.set_repeat(Repeat::Infinite).unwrap(); //! for state in &beacon_states { //! let mut frame = Frame::default(); //! frame.width = width; //! frame.height = height; //! frame.buffer = Cow::Borrowed(&*state); //! encoder.write_frame(&frame).unwrap(); //! } //! ``` //! //! [`Frame::from_*`](struct.Frame.html) can be used to convert a true color image to a paletted //! image with a maximum of 256 colors: //! //! ```rust //! # #[cfg(feature = "color_quant")] { //! use std::fs::File; //! //! // Get pixel data from some source //! let mut pixels: Vec = vec![0; 30_000]; //! // Create frame from data //! let frame = gif::Frame::from_rgb(100, 100, &mut *pixels); //! // Create encoder //! let mut image = File::create("target/indexed_color.gif").unwrap(); //! let mut encoder = gif::Encoder::new(&mut image, frame.width, frame.height, &[]).unwrap(); //! // Write frame to file //! encoder.write_frame(&frame).unwrap(); //! # } //! ``` // TODO: make this compile // ```rust // use gif::{Frame, Encoder}; // use std::fs::File; // let color_map = &[0, 0, 0, 0xFF, 0xFF, 0xFF]; // let mut frame = Frame::default(); // // Generate checkerboard lattice // for (i, j) in (0..10).zip(0..10) { // frame.buffer.push(if (i * j) % 2 == 0 { // 1 // } else { // 0 // }) // } // # (|| { // { // let mut file = File::create("test.gif")?; // let mut encoder = Encoder::new(&mut file, 100, 100); // encoder.write_global_palette(color_map)?.write_frame(&frame) // } // # })().unwrap(); // ``` #![deny(missing_docs)] #![cfg(feature = "std")] mod traits; mod common; mod reader; mod encoder; pub use crate::common::{AnyExtension, Block, Extension, DisposalMethod, Frame}; pub use crate::reader::{StreamingDecoder, Decoded, DecodingError, DecodingFormatError}; /// StreamingDecoder configuration parameters pub use crate::reader::{ColorOutput, MemoryLimit, Extensions}; pub use crate::reader::{DecodeOptions, Decoder, Version}; pub use crate::encoder::{Encoder, ExtensionData, Repeat, EncodingError}; #[cfg(test)] #[test] fn round_trip() { use std::io::prelude::*; use std::fs::File; let mut data = vec![]; File::open("tests/samples/sample_1.gif").unwrap().read_to_end(&mut data).unwrap(); let mut decoder = Decoder::new(&*data).unwrap(); let palette: Vec = decoder.palette().unwrap().into(); let frame = decoder.read_next_frame().unwrap().unwrap(); let mut data2 = vec![]; { let mut encoder = Encoder::new(&mut data2, frame.width, frame.height, &palette).unwrap(); encoder.write_frame(frame).unwrap(); } assert_eq!(&data[..], &data2[..]) } macro_rules! insert_as_doc { { $content:expr } => { #[doc = $content] extern { } } } // Provides the README.md as doc, to ensure the example works! #[cfg(feature = "color_quant")] insert_as_doc!(include_str!("../README.md"));