pub trait ImageDecoder<'a>: Sized {
    type Reader: Read + 'a;

    // Required methods
    fn dimensions(&self) -> (u32, u32);
    fn color_type(&self) -> ColorType;
    fn into_reader(self) -> Result<Self::Reader, ImageError>;

    // Provided methods
    fn original_color_type(&self) -> ExtendedColorType { ... }
    fn total_bytes(&self) -> u64 { ... }
    fn scanline_bytes(&self) -> u64 { ... }
    fn read_image(self, buf: &mut [u8]) -> Result<(), ImageError> { ... }
    fn read_image_with_progress<F>(
        self,
        buf: &mut [u8],
        progress_callback: F
    ) -> Result<(), ImageError>
       where F: Fn(Progress) { ... }
}
Expand description

The trait that all decoders implement

Required Associated Types§

source

type Reader: Read + 'a

The type of reader produced by into_reader.

Required Methods§

source

fn dimensions(&self) -> (u32, u32)

Returns a tuple containing the width and height of the image

source

fn color_type(&self) -> ColorType

Returns the color type of the image data produced by this decoder

source

fn into_reader(self) -> Result<Self::Reader, ImageError>

Returns a reader that can be used to obtain the bytes of the image. For the best performance, always try to read at least scanline_bytes from the reader at a time. Reading fewer bytes will cause the reader to perform internal buffering.

Provided Methods§

source

fn original_color_type(&self) -> ExtendedColorType

Retuns the color type of the image file before decoding

source

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.

source

fn scanline_bytes(&self) -> u64

Returns the minimum number of bytes that can be efficiently read from this decoder. This may be as few as 1 or as many as total_bytes().

source

fn read_image(self, buf: &mut [u8]) -> Result<(), ImageError>

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
}
source

fn read_image_with_progress<F>( self, buf: &mut [u8], progress_callback: F ) -> Result<(), ImageError>
where F: Fn(Progress),

Same as read_image but periodically calls the provided callback to give updates on loading progress.

Object Safety§

This trait is not object safe.

Implementors§

source§

impl<'a, R> ImageDecoder<'a> for BmpDecoder<R>
where R: 'a + Read + Seek,

§

type Reader = BmpReader<R>

source§

impl<'a, R> ImageDecoder<'a> for DdsDecoder<R>
where R: 'a + Read,

source§

impl<'a, R> ImageDecoder<'a> for DxtDecoder<R>
where R: 'a + Read,

source§

impl<'a, R> ImageDecoder<'a> for FarbfeldDecoder<R>
where R: 'a + Read,

source§

impl<'a, R> ImageDecoder<'a> for GifDecoder<R>
where R: 'a + Read,

source§

impl<'a, R> ImageDecoder<'a> for HdrAdapter<R>
where R: 'a + BufRead,

source§

impl<'a, R> ImageDecoder<'a> for IcoDecoder<R>
where R: 'a + Read + Seek,

§

type Reader = IcoReader<R>

source§

impl<'a, R> ImageDecoder<'a> for JpegDecoder<R>
where R: 'a + Read,

§

type Reader = JpegReader<R>

source§

impl<'a, R> ImageDecoder<'a> for PngDecoder<R>
where R: 'a + Read,

source§

impl<'a, R> ImageDecoder<'a> for PnmDecoder<R>
where R: 'a + Read,

§

type Reader = PnmReader<R>

source§

impl<'a, R> ImageDecoder<'a> for TgaDecoder<R>
where R: 'a + Read + Seek,

§

type Reader = TGAReader<R>

source§

impl<'a, R> ImageDecoder<'a> for TiffDecoder<R>
where R: 'a + Read + Seek,

source§

impl<'a, R> ImageDecoder<'a> for WebPDecoder<R>
where R: 'a + Read,

§

type Reader = WebpReader<R>