Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Image | 3,911 | 2,202 | 1,381 | 3 days ago | 101 | September 25, 2022 | 273 | mit | Rust | |
Encoding and decoding images in Rust | ||||||||||
Image Tiff | 76 | 386 | 6 | 3 months ago | 15 | July 24, 2022 | 23 | mit | Rust | |
TIFF decoding and encoding library in pure Rust | ||||||||||
Mipi Csi 2 | 6 | 3 years ago | other | SystemVerilog | ||||||
Capture images/video from a Raspberry Pi Camera (MIPI CSI-2) with an FPGA | ||||||||||
Hyperstencil | 3 | 4 years ago | 1 | mit | Rust | |||||
A bespoke multichannel raw image utility | ||||||||||
Pyglet Avbin Optimizations | 2 | 13 years ago | bsd-3-clause | Python | ||||||
an attempt to speed up pyglet's video decoding pipeline by using a fragment shader for YUV to RGB color space conversion |
Maintainers: @HeroicKatora, @fintelia
This crate provides basic image processing functions and methods for converting to and from various image formats.
All image processing functions provided operate on types that implement the GenericImageView
and GenericImage
traits and return an ImageBuffer
.
image
provides implementations of common image format encoders and decoders.
Format | Decoding | Encoding |
---|---|---|
PNG | All supported color types | Same as decoding |
JPEG | Baseline and progressive | Baseline JPEG |
GIF | Yes | Yes |
BMP | Yes | Rgb8, Rgba8, Gray8, GrayA8 |
ICO | Yes | Yes |
TIFF | Baseline(no fax support) + LZW + PackBits | Rgb8, Rgba8, Gray8 |
WebP | Yes | Rgb8, Rgba8 * |
AVIF | Only 8-bit ** | Lossy |
PNM | PBM, PGM, PPM, standard PAM | Yes |
DDS | DXT1, DXT3, DXT5 | No |
TGA | Yes | Rgb8, Rgba8, Bgr8, Bgra8, Gray8, GrayA8 |
OpenEXR | Rgb32F, Rgba32F (no dwa compression) | Rgb32F, Rgba32F (no dwa compression) |
farbfeld | Yes | Yes |
webp-encoder
feature, uses the libwebp C library.avif-decoder
feature, uses the libdav1d C library.ImageDecoder
and ImageDecoderRect
TraitsAll image format decoders implement the ImageDecoder
trait which provide
basic methods for getting image metadata and decoding images. Some formats
additionally provide ImageDecoderRect
implementations which allow for
decoding only part of an image at once.
The most important methods for decoders are...
image
provides the following pixel types:
All pixels are parameterised by their component type.
Individual pixels within images are indexed with (0,0) at the top left corner.
GenericImageView
and GenericImage
TraitsTraits that provide methods for inspecting (GenericImageView
) and manipulating (GenericImage
) images, parameterised over the image's pixel type.
Some of these methods for GenericImageView
are...
While some of the methods for GenericImage
are...
image
provides two main ways of representing image data:
ImageBuffer
An image parameterised by its Pixel types, represented by a width and height and a vector of pixels. It provides direct access to its pixels and implements the GenericImageView
and GenericImage
traits.
use image::{GenericImage, GenericImageView, ImageBuffer, RgbImage};
// Construct a new RGB ImageBuffer with the specified width and height.
let img: RgbImage = ImageBuffer::new(512, 512);
// Construct a new by repeated calls to the supplied closure.
let mut img = ImageBuffer::from_fn(512, 512, |x, y| {
if x % 2 == 0 {
image::Luma([0u8])
} else {
image::Luma([255u8])
}
});
// Obtain the image's width and height.
let (width, height) = img.dimensions();
// Access the pixel at coordinate (100, 100).
let pixel = img[(100, 100)];
// Or use the `get_pixel` method from the `GenericImage` trait.
let pixel = *img.get_pixel(100, 100);
// Put a pixel at coordinate (100, 100).
img.put_pixel(100, 100, pixel);
// Iterate over all pixels in the image.
for pixel in img.pixels() {
// Do something with pixel.
}
DynamicImage
A DynamicImage
is an enumeration over all supported ImageBuffer<P>
types.
Its exact image type is determined at runtime. It is the type returned when opening an image.
For convenience DynamicImage
reimplements all image processing functions.
DynamicImage
implement the GenericImageView
and GenericImage
traits for RGBA pixels.
SubImage
A view into another image, delimited by the coordinates of a rectangle. The coordinates given set the position of the top left corner of the rectangle. This is used to perform image processing functions on a subregion of an image.
use image::{GenericImageView, ImageBuffer, RgbImage, imageops};
let mut img: RgbImage = ImageBuffer::new(512, 512);
let subimg = imageops::crop(&mut img, 0, 0, 100, 100);
assert!(subimg.dimensions() == (100, 100));
These are the functions defined in the imageops
module. All functions operate on types that implement the GenericImage
trait.
Note that some of the functions are very slow in debug mode. Make sure to use release mode if you experience any performance issues.
For more options, see the imageproc
crate.
image
provides the open
function for opening images from a path. The image
format is determined from the path's file extension. An io
module provides a
reader which offer some more control.
use image::GenericImageView;
fn main() {
// Use the open function to load an image from a Path.
// `open` returns a `DynamicImage` on success.
let img = image::open("tests/images/jpg/progressive/cat.jpg").unwrap();
// The dimensions method returns the images width and height.
println!("dimensions {:?}", img.dimensions());
// The color method returns the image's `ColorType`.
println!("{:?}", img.color());
// Write the contents of this image to the Writer in PNG format.
img.save("test.png").unwrap();
}
//! An example of generating julia fractals.
fn main() {
let imgx = 800;
let imgy = 800;
let scalex = 3.0 / imgx as f32;
let scaley = 3.0 / imgy as f32;
// Create a new ImgBuf with width: imgx and height: imgy
let mut imgbuf = image::ImageBuffer::new(imgx, imgy);
// Iterate over the coordinates and pixels of the image
for (x, y, pixel) in imgbuf.enumerate_pixels_mut() {
let r = (0.3 * x as f32) as u8;
let b = (0.3 * y as f32) as u8;
*pixel = image::Rgb([r, 0, b]);
}
// A redundant loop to demonstrate reading image data
for x in 0..imgx {
for y in 0..imgy {
let cx = y as f32 * scalex - 1.5;
let cy = x as f32 * scaley - 1.5;
let c = num_complex::Complex::new(-0.4, 0.6);
let mut z = num_complex::Complex::new(cx, cy);
let mut i = 0;
while i < 255 && z.norm() <= 2.0 {
z = z * z + c;
i += 1;
}
let pixel = imgbuf.get_pixel_mut(x, y);
let image::Rgb(data) = *pixel;
*pixel = image::Rgb([data[0], i as u8, data[2]]);
}
}
// Save the image as “fractal.png”, the format is deduced from the path
imgbuf.save("fractal.png").unwrap();
}
Example output:
If the high level interface is not needed because the image was obtained by other means, image
provides the function save_buffer
to save a buffer to a file.
fn main() {
let buffer: &[u8] = unimplemented!(); // Generate the image data
// Save the buffer as "image.png"
image::save_buffer("image.png", buffer, 800, 600, image::ColorType::Rgb8).unwrap()
}