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 README.md
for further details.
- 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.
- 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-vectorizeImageBuffer::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
flat::Error
now implements the standardError
trait- The type parameter of
Map
has been relaxed to?Sized
- Added the
imageops::tile
function that repeats one image across another
- 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
- 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-helperImageBuffer::as_flat_samples
.
- 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 ofGenericImageView
. This allows images that are only partially present in memory to be encoded. ImageBuffer
now derivesHash
,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 value1
as white instead of255
. - Fix encoding of RGBA data in
gif
frames. - Constructing a
Rows
/RowsMut
iterator no longer panics when the image has a width or height of0
.
- Improved the performance of decoding animated gifs
- Added
crop_imm
which functions likecrop
but on a shared reference - The gif
DisposalMethod::Any
is treated asKeep
, consistent with browsers - Most errors no longer allocate a string, instead implement Display.
- Add some implementations of
Error::source
- 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
- The dependency on
jpeg-decoder
now reflects minimum requirements.
- 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
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 aColorType
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
and16-bit BGR
are instantiations ofRGB
color model.
- 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
- 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.
- 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
- 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 withGenericImage
sizes. - The
colortype
method was renamed tocolor_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 anImageResult<()>
. - 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 inimage
itself. - On that note, the public interface of
gif
encoder no longer takes agif::Frame
but rather deals withimage::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 spelledGif
,Png
, etc. The same change has been made to the name of types such asHDRDecoder
. - The
Progress
type has finally received public accessor method. Strange that no one reported them missing. - Introduced
PixelDensity
andPixelDensityUnit
to store DPI information in formats that support encoding this form of meta data (e.g. injpeg
).
- Added
GenericImage::copy_within
, specialized forImageBuffer
- Fixed decoding of interlaced
gif
files - Prepare for future compatibility of array
IntoIterator
in example code
- 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
withsave_buffer
.
- Added a new module
io
containing a configurableReader
. It can replace the bunch of free functions:image::{load_*, open, image_dimensions}
while enabling new combinations such asopen
but with format deduced from content instead of file path. - Fixed
const_err
lint in the macro expanded implementations ofPixel
. This can only affect your crate ifimage
is used as a path dependency.
- Undeprecate
unsafe
trait accessors. Further evaluation showed that their deprecation should be delayed until traitimpl
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 theopen
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 intiff
.
- Fixed build without no features enabled
- The required Rust version is now
1.34.2
. - Note the website and blog: image-rs.org and blog.image-rs.org
PixelMut
now only onImageBuffer
and removed fromGenericImage
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
andmap_without_alpha
toPixel
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
- 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
- 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
- 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
- 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
andGenericImageView
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
- 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)]
forColorType
. - 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.
- Various improvements.
- Additional supported image formats (BMP and ICO).
- GIF and PNG codec moved into separate crates.
- Replace
std::old_io
withstd::io
.
- 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.
- 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
orinvert