pub trait ImageDecoder {
// Required methods
fn dimensions(&self) -> (u32, u32);
fn color_type(&self) -> ColorType;
fn read_image(self, buf: &mut [u8]) -> ImageResult<()>
where Self: Sized;
fn read_image_boxed(self: Box<Self>, buf: &mut [u8]) -> ImageResult<()>;
// Provided methods
fn original_color_type(&self) -> ExtendedColorType { ... }
fn icc_profile(&mut self) -> ImageResult<Option<Vec<u8>>> { ... }
fn exif_metadata(&mut self) -> ImageResult<Option<Vec<u8>>> { ... }
fn orientation(&mut self) -> ImageResult<Orientation> { ... }
fn total_bytes(&self) -> u64 { ... }
fn set_limits(&mut self, limits: Limits) -> ImageResult<()> { ... }
}
Expand description
The trait that all decoders implement
Required Methods§
Sourcefn dimensions(&self) -> (u32, u32)
fn dimensions(&self) -> (u32, u32)
Returns a tuple containing the width and height of the image
Sourcefn color_type(&self) -> ColorType
fn color_type(&self) -> ColorType
Returns the color type of the image data produced by this decoder
Sourcefn read_image(self, buf: &mut [u8]) -> ImageResult<()>where
Self: Sized,
fn read_image(self, buf: &mut [u8]) -> ImageResult<()>where
Self: Sized,
Returns all the bytes in the image.
This function takes a slice of bytes and writes the pixel data of the image into it. Although not required, for certain color types callers may want to pass buffers which are aligned to 2 or 4 byte boundaries to the slice can be cast to a u16 or u32. To accommodate such casts, the returned contents will always be in native endian.
§Panics
This function panics if buf.len() != self.total_bytes()
.
§Examples
use zerocopy::{AsBytes, FromBytes};
fn read_16bit_image(decoder: impl ImageDecoder) -> Vec<16> {
let mut buf: Vec<u16> = vec![0; decoder.total_bytes()/2];
decoder.read_image(buf.as_bytes());
buf
}
Sourcefn read_image_boxed(self: Box<Self>, buf: &mut [u8]) -> ImageResult<()>
fn read_image_boxed(self: Box<Self>, buf: &mut [u8]) -> ImageResult<()>
Use read_image
instead; this method is an implementation detail needed so the trait can
be object safe.
Note to implementors: This method should be implemented by calling read_image
on
the boxed decoder…
fn read_image_boxed(self: Box<Self>, buf: &mut [u8]) -> ImageResult<()> {
(*self).read_image(buf)
}
Provided Methods§
Sourcefn original_color_type(&self) -> ExtendedColorType
fn original_color_type(&self) -> ExtendedColorType
Returns the color type of the image file before decoding
Sourcefn icc_profile(&mut self) -> ImageResult<Option<Vec<u8>>>
fn icc_profile(&mut self) -> ImageResult<Option<Vec<u8>>>
Returns the ICC color profile embedded in the image, or Ok(None)
if the image does not have one.
For formats that don’t support embedded profiles this function should always return Ok(None)
.
Sourcefn exif_metadata(&mut self) -> ImageResult<Option<Vec<u8>>>
fn exif_metadata(&mut self) -> ImageResult<Option<Vec<u8>>>
Returns the raw Exif chunk, if it is present.
A third-party crate such as kamadak-exif
is required to actually parse it.
For formats that don’t support embedded profiles this function should always return Ok(None)
.
Sourcefn orientation(&mut self) -> ImageResult<Orientation>
fn orientation(&mut self) -> ImageResult<Orientation>
Returns the orientation of the image.
This is usually obtained from the Exif metadata, if present. Formats that don’t support
indicating orientation in their image metadata will return Ok(Orientation::NoTransforms)
.
Sourcefn total_bytes(&self) -> u64
fn total_bytes(&self) -> u64
Returns the total number of bytes in the decoded image.
This is the size of the buffer that must be passed to read_image
or
read_image_with_progress
. The returned value may exceed usize::MAX
, in
which case it isn’t actually possible to construct a buffer to decode all the image data
into. If, however, the size does not fit in a u64 then u64::MAX
is returned.
Sourcefn set_limits(&mut self, limits: Limits) -> ImageResult<()>
fn set_limits(&mut self, limits: Limits) -> ImageResult<()>
Set the decoder to have the specified limits. See Limits
for the different kinds of
limits that is possible to set.
Note to implementors: make sure you call Limits::check_support
so that
decoding fails if any unsupported strict limits are set. Also make sure
you call Limits::check_dimensions
to check the max_image_width
and
max_image_height
limits.
Implementations on Foreign Types§
Source§impl<T: ?Sized + ImageDecoder> ImageDecoder for Box<T>
impl<T: ?Sized + ImageDecoder> ImageDecoder for Box<T>
fn dimensions(&self) -> (u32, u32)
fn color_type(&self) -> ColorType
fn original_color_type(&self) -> ExtendedColorType
fn icc_profile(&mut self) -> ImageResult<Option<Vec<u8>>>
fn exif_metadata(&mut self) -> ImageResult<Option<Vec<u8>>>
fn total_bytes(&self) -> u64
fn read_image(self, buf: &mut [u8]) -> ImageResult<()>where
Self: Sized,
fn read_image_boxed(self: Box<Self>, buf: &mut [u8]) -> ImageResult<()>
fn set_limits(&mut self, limits: Limits) -> ImageResult<()>
Implementors§
impl<R: BufRead + Seek> ImageDecoder for BmpDecoder<R>
bmp
only.impl<R: BufRead + Seek> ImageDecoder for GifDecoder<R>
gif
only.impl<R: BufRead + Seek> ImageDecoder for IcoDecoder<R>
ico
only.impl<R: BufRead + Seek> ImageDecoder for JpegDecoder<R>
jpeg
only.impl<R: BufRead + Seek> ImageDecoder for OpenExrDecoder<R>
exr
only.impl<R: BufRead + Seek> ImageDecoder for PngDecoder<R>
png
only.impl<R: BufRead + Seek> ImageDecoder for TiffDecoder<R>
tiff
only.impl<R: BufRead + Seek> ImageDecoder for WebPDecoder<R>
webp
only.impl<R: Read> ImageDecoder for AvifDecoder<R>
avif-native
and (crate features avif
or avif-native
) only.impl<R: Read> ImageDecoder for DdsDecoder<R>
dds
only.impl<R: Read> ImageDecoder for FarbfeldDecoder<R>
ff
only.impl<R: Read> ImageDecoder for HdrDecoder<R>
hdr
only.impl<R: Read> ImageDecoder for PnmDecoder<R>
pnm
only.impl<R: Read> ImageDecoder for QoiDecoder<R>
qoi
only.impl<R: Read> ImageDecoder for TgaDecoder<R>
tga
only.