Skip to content
Switch branches/tags
Go to file
Cannot retrieve contributors at this time

Rust Image Release Notes

Rust image aims to be a pure-Rust implementation of various popular image formats. Accompanying reading/write support, rust image provides basic imaging processing function. See for further details.

Known issues

  • Images with n bit/channel (n ≠ 8) are not well supported but basic support for 16-bit is available and implemented for PNG.
  • Not all Interlaced (progressive) or animated images are well supported.
  • The color space information of pixels is not clearly communicated.


Version 0.23.14

  • Unified gif blending in different decode methods, fixing out-of-bounds checks in a number of weirdly positioned frames.

  • Hardened TGA decoder against a number of malicious inputs.

  • Fix forward incompatible usage of the panic macro.

  • Fix load_rect for gif reaching unreachable!() code.

  • Added ExtendedColorType::A8.

  • Allow TGA to load alpha-only images.

  • Optimized load_rect to avoid unnecessary seeks.

Version 0.23.13

  • Fix an inconsistency in supported formats of different methods for encoding an image.

  • Fix thumbnail choosing an empty image. It now always prefer non-empty image dimensions.

  • Fix integer overflow in calculating requires bytes for decoded image buffers for farbfeld, hdr, and pnm decoders. These will now error early.

  • Fix a panic decoding certain jpeg image without frames or meta data.

  • Optimized the jpeg encoder.

  • Optimized GenericImage::copy_from default impl in various cases.

  • Add avif decoders. You must enable it explicitly and it is not covered by our usual MSRV policy of Rust 1.34. Instead, only latest stable is supported.

  • Add ImageFormat::{can_read, can_write}

  • Add Frame::buffer_mut

  • Add speed and quality options on avif encoder.

  • Add speed parameter to gif encoder.

  • Expose control over sequence repeat to the gif encoder.

  • Add {contrast,brighten,huerotate}_in_place functions in imageproc.

  • Relax Default impl of ImageBuffer, removing the bound on the color type.

  • Derive Debug, Hash, PartialEq, Eq for DynamicImage

Version 0.23.12

  • Fix a soundness issue affecting the impls of Pixel::from_slice_mut. This would previously reborrow the mutable input reference as a shared one but then proceed to construct the mutable result reference from it. While UB according to Rust's memory model, we're fairly certain that no miscompilation can happen with the LLVM codegen in practice. See 5cbe1e6767d11aff3f14c7ad69a06b04e8d583c7 for more details.

  • Fix imageops::blur panicking when sigma = 0.0. It now defaults to 1.0 as all negative values.

  • Fix re-exporting png::{CompressionType, FilterType} to maintain SemVer compatibility with the 0.23 releases.

  • Add ImageFormat::from_extension

  • Add copyless DynamicImage to byte slice/vec conversion.

  • Add bit-depth specific into_ and to_ DynamicImage conversion methods.

Version 0.23.11

  • The NeuQuant implementation is now supplied by color_quant. Use of the type defined by this library is discouraged.
  • The jpeg decoder can now downscale images that are decoded by 1,2,4,8.
  • Optimized the jpeg encoding ~5-15%.
  • Deprecated the clamp function. Use num-traits instead.
  • The ICO decoder now accepts an empty mask.
  • Fixed an overflow in ICO mask decoding potentially leading to panic.
  • Added ImageOutputFormat for AVIF
  • Updated tiff to 0.6 with lzw performance improvements.

Version 0.23.10

  • Added AVIF encoding capabilities using the ravif crate. Please note that the feature targets the latest stable compiler and is not enabled by default.
  • Added ImageBuffer::as_raw to inspect the underlying container.
  • Updated gif to 0.11 with large performance improvements.

Version 0.23.9

  • Introduced correctly capitalized aliases for some scream case types
  • Introduced imageops::{vertical_gradient, horizontal_gradient} for writing simple color gradients into an image.
  • Sped up methods iterating over Pixels, PixelsMut, etc. by using exact chunks internally. This should auto-vectorize ImageBuffer::from_pixel.
  • Adjusted Clone impls of iterators to not require a bound on the pixel.
  • Add Debug impls for iterators where the pixel's channel implements it.
  • Add comparison impls for FilterType

Version 0.23.8

  • flat::Error now implements the standard Error trait
  • The type parameter of Map has been relaxed to ?Sized
  • Added the imageops::tile function that repeats one image across another

Version 0.23.7

  • Iterators over immutable pixels of ImageBuffer can now be cloned
  • Added a tga encoder
  • Added ColorMap::lookup, an optional reversal of the map
  • The EncodableLayout trait is now exported

Version 0.23.6

  • Added png::ApngDecoder, an adapter decoding the animation in an APNG.
  • Fixed a bug in jpeg encoding that would darken output colors.
  • Added a utility constructor FlatSamples::with_monocolor.
  • Added ImageBuffer::as_flat_samples_mut which is a mutable variant of the existing ffi-helper ImageBuffer::as_flat_samples.

Version 0.23.5

  • The png encoder now allows configuring compression and filter type. The output is not part of stability guarantees, see its documentation.
  • The jpeg encoder now accepts any implementor of GenericImageView. This allows images that are only partially present in memory to be encoded.
  • ImageBuffer now derives Hash, PartialEq, Eq.
  • The Pixels/PixelsMut iterator no longer yields out-of-bounds pixels when the underlying buffer is larger than required.
  • The pbm decoder correctly decodes ascii data again, fixing a regression where it would use the sample value 1 as white instead of 255.
  • Fix encoding of RGBA data in gif frames.
  • Constructing a Rows/RowsMut iterator no longer panics when the image has a width or height of 0.

Version 0.23.4

  • Improved the performance of decoding animated gifs
  • Added crop_imm which functions like crop but on a shared reference
  • The gif DisposalMethod::Any is treated as Keep, consistent with browsers
  • Most errors no longer allocate a string, instead implement Display.
  • Add some implementations of Error::source

Version 0.23.3

  • Added ColorType::has_alpha to facilitate lossless conversion
  • Recognize extended WebP formats for decoding
  • Added decoding and encoding for the farbfeld format
  • Export named iterator types created from various ImageBuffer methods
  • Error in jpeg encoder for images larger than 65536 pixels, fixes panic

Version 0.23.2

  • The dependency on jpeg-decoder now reflects minimum requirements.

Version 0.23.1

  • Fix cmyk_to_rgb (jpeg) causing off by one rounding errors.
  • A number of performance improvements for jpeg (encode and decode), bmp, vp8
  • Added more details to errors for many formats

Version 0.23.0

This major release intends to improve the interface with regards to handling of color format data and errors for both decoding and encoding. This necessitated many breaking changes anyways so it was used to improve the compliance to the interface guidelines such as outstanding renaming.

It is not yet perfect with regards to color spaces but it was designed mainly as an improvement over the current interface with regards to in-memory color formats, first. We'll get to color spaces in a later major version.

  • Heavily reworked ColorType:
    • This type is now used for denoting formats for which we support operations on buffers in these memory representations. Particularly, all channels in pixel types are assumed to be an integer number of bytes (In terms of the Rust type system, these are Sized and one can crate slices of channel values).
    • An ExtendedColorType is used to express more generic color formats for which the library has limited support but can be converted/scaled/mapped into a ColorType buffer. This operation might be fallible but, for example, includes sources with 1/2/4-bit components.
    • Both types are non-exhaustive to add more formats in a minor release.
    • A work-in-progress (#1085) will further separate the color model from the specific channel instantiation, e.g. both 8-bit RGB and 16-bit BGR are instantiations of RGB color model.
  • Heavily rework ImageError:
    • The top-level enum type now serves to differentiate cause with multiple opaque representations for the actual error. These are no longer simple Strings but contains useful types. Third-party decoders that have no variant in ImageFormat have also been considered.
    • Support for Error::source that can be downcast to an error from a matching version of the underlying decoders. Note that the version is not part of the stable interface guarantees, this should not be relied upon for correctness and only be used as an optimization.
    • Added image format indications to errors.
    • The error values produced by decoder will be upgraded incrementally. See something that still produces plain old String messages? Feel free to send a PR.
  • Reworked the ImageDecoder trait:
    • read_image takes an output buffer argument instead of allocating all memory on its own.
    • The return type of dimensions now aligns with GenericImage sizes.
    • The colortype method was renamed to color_type for conformity.
  • The enums ColorType, DynamicImage, imageops::FilterType, ImageFormat no longer re-export all of their variants in the top-level of the crate. This removes the growing pollution in the documentation and usage. You can still insert the equivalent statement on your own: use image::ImageFormat::{self, *};
  • The result of encode operations is now uniformly an ImageResult<()>.
  • Removed public converters from some tiff, png, gif, jpeg types, mainly such as error conversion. This allows upgrading the dependency across major versions without a major release in image itself.
  • On that note, the public interface of gif encoder no longer takes a gif::Frame but rather deals with image::Frame only. If you require to specify the disposal method, transparency, etc. then you may want to wait with upgrading but (see next change).
  • The gif encoder now errors on invalid dimensions or unsupported color formats. It would previously silently reinterpret bytes as RGB/RGBA.
  • The capitalization of ImageFormat and other enum variants has been adjusted to adhere to the API guidelines. These variants are now spelled Gif, Png, etc. The same change has been made to the name of types such as HDRDecoder.
  • The Progress type has finally received public accessor method. Strange that no one reported them missing.
  • Introduced PixelDensity and PixelDensityUnit to store DPI information in formats that support encoding this form of meta data (e.g. in jpeg).

Version 0.22.5

  • Added GenericImage::copy_within, specialized for ImageBuffer
  • Fixed decoding of interlaced gif files
  • Prepare for future compatibility of array IntoIterator in example code

Version 0.22.4

  • Added in-place variants for flip and rotate operations.
  • The bmp encoder now checks if dimensions are valid for the format. It would previously write a subset or panic.
  • Removed deprecated implementations of Error::description
  • Added DynamicImage::into_* which convert without an additional allocation.
  • The PNG encoder errors on unsupported color types where it had previously silently swapped color channels.
  • Enabled saving images as gif with save_buffer.

Version 0.22.3

  • Added a new module io containing a configurable Reader. It can replace the bunch of free functions: image::{load_*, open, image_dimensions} while enabling new combinations such as open but with format deduced from content instead of file path.
  • Fixed const_err lint in the macro expanded implementations of Pixel. This can only affect your crate if image is used as a path dependency.

Version 0.22.2

  • Undeprecate unsafe trait accessors. Further evaluation showed that their deprecation should be delayed until trait impl specialization is available.
  • Fixed magic bytes used to detect tiff images.
  • Added DynamicImage::from_decoder.
  • Fixed a bug in the PNGReader that caused an infinite loop.
  • Added ColorType::{bits_per_pixel, num_components}.
  • Added ImageFormat::from_path, same format deduction as the open method.
  • Fixed a panic in the gif decoder.
  • Aligned background color handling of gif to web browser implementations.
  • Fixed handling of partial frames in animated gif.
  • Removed unused direct lzw dependency, an indirect dependency in tiff.

Version 0.22.1

  • Fixed build without no features enabled

Version 0.22

  • The required Rust version is now 1.34.2.
  • Note the website and blog: and
  • PixelMut now only on ImageBuffer and removed from GenericImage interface. Prefer iterating manually in the generic case.
  • Replaced an unsafe interface in the hdr decoder with a safe variant.
  • Support loading 2-bit BMP images
  • Add method to save an ImageBuffer/DynamicImage with specified format
  • Update tiff to 0.3 with a writer
  • Update png to 0.15, fixes reading of interlaced sub-byte pixels
  • Always use custom struct for ImageDecoder::Reader
  • Added apply_without_alpha and map_without_alpha to Pixel trait
  • Pixel information now with associated constants instead of static methods
  • Changed color structs to tuple types with single component. Improves ergonomics of destructuring assignment and construction.
  • Add lifetime parameter on ImageDecoder trait.
  • Remove unecessary 'static bounds on affine operations
  • Add function to retrieve image dimensions without loading full image
  • Allow different image types in overlay and replace
  • Iterators over rows of ImageBuffer, mutable variants

Version 0.21.2

  • Fixed a variety of crashes and opaque errors in webp
  • Updated the png limits to be less restrictive
  • Reworked even more unsafe operations into safe alternatives
  • Derived Debug on FilterType and Deref on Pixel
  • Removed a restriction on DXT to always require power of two dimensions
  • Change the encoding of RGBA in bmp using bitfields
  • Corrected various urls

Version 0.21.1

  • A fairly important bugfix backport
  • Fixed a potentially memory safety issue in the hdr and tiff decoders, see #885
  • See the full advisory for an analysis
  • Fixes ImageBuffer index calculation for very, very large images
  • Fix some crashes while parsing specific incomplete pnm images
  • Added comprehensive fuzzing for the pam image types

Version 0.21

  • Updated README to use GenericImageView
  • Removed outdated version number from CHANGES
  • Compiles now with wasm-unknown-emscripten target
  • Restructured ImageDecoder trait
  • Updated README with a more colorful example for the Julia fractal
  • Use Rust 1.24.1 as minimum supported version
  • Support for loading GIF frames one at a time with animation::Frames
  • The TGA decoder now recognizes 32 bpp as RGBA(8)
  • Fixed to_bgra document comment
  • Added release test script
  • Removed unsafe code blocks several places
  • Fixed overlay overflow bug issues with documented proofs

Version 0.20

  • Clippy lint pass
  • Updated num-rational dependency
  • Added BGRA and BGR color types
  • Improved performance of image resizing
  • Improved PBM decoding
  • PNM P4 decoding now returns bits instead of bytes
  • Fixed move of overlapping buffers in BMP decoder
  • Fixed some document comments
  • GenericImage and GenericImageView is now object-safe
  • Moved TIFF code to its own library
  • Fixed README examples
  • Fixed ordering of interpolated parameters in TIFF decode error string
  • Thumbnail now handles upscaling
  • GIF encoding for multiple frames
  • Improved subimages API
  • Cargo fmt fixes

Version 0.19

  • Fixed panic when blending with alpha zero.
  • Made save consistent.
  • Consistent size calculation.
  • Fixed bug in apply_with_alpha.
  • Implemented TGADecoder::read_scanline.
  • Use deprecated attribute for pixels_mut.
  • Fixed bug in JPEG grayscale encoding.
  • Fixed multi image TIFF.
  • PNM encoder.
  • Added #[derive(Hash)] for ColorType.
  • Use num-derive for #[derive(FromPrimitive)].
  • Added into_frames implementation for GIF.
  • Made rayon an optional dependency.
  • Fixed issue where resizing image did not give exact width/height.
  • Improved downscale.
  • Added a way to expose options when saving files.
  • Fixed some compiler warnings.
  • Switched to lzw crate instead of using built-in version.
  • Added ExactSizeIterator implementations to buffer structs.
  • Added resize_to_fill method.
  • DXT encoding support.
  • Applied clippy suggestions.

Version 0.4

  • Various improvements.
  • Additional supported image formats (BMP and ICO).
  • GIF and PNG codec moved into separate crates.

Version 0.3

  • Replace std::old_io with std::io.

Version 0.2

  • Support for interlaced PNG images.
  • Writing support for GIF images (full color and paletted).
  • Color quantizer that converts 32bit images to paletted including the alpha channel.
  • Initial support for reading TGA images.
  • Reading support for TIFF images (packbits and FAX compression not supported).
  • Various bug fixes and improvements.

Version 0.1

  • Initial release
  • Basic reading support for png, jpeg, gif, ppm and webp.
  • Basic writing support for png and jpeg.
  • A collection of basic imaging processing function like blur or invert