Struct rerun::external::image::ImageReader
pub struct ImageReader<R>{
inner: R,
format: Option<ImageFormat>,
limits: Limits,
}
Expand description
A multi-format image reader.
Wraps an input reader to facilitate automatic detection of an image’s format, appropriate
decoding method, and dispatches into the set of supported ImageDecoder
implementations.
§Usage
Opening a file, deducing the format based on the file path automatically, and trying to decode the image contained can be performed by constructing the reader and immediately consuming it.
let image = ImageReader::open("path/to/image.png")?
.decode()?;
It is also possible to make a guess based on the content. This is especially handy if the
source is some blob in memory and you have constructed the reader in another way. Here is an
example with a pnm
black-and-white subformat that encodes its pixel matrix with ascii values.
use std::io::Cursor;
use image::ImageFormat;
let raw_data = b"P1 2 2\n\
0 1\n\
1 0\n";
let mut reader = ImageReader::new(Cursor::new(raw_data))
.with_guessed_format()
.expect("Cursor io never fails");
assert_eq!(reader.format(), Some(ImageFormat::Pnm));
let image = reader.decode()?;
As a final fallback or if only a specific format must be used, the reader always allows manual
specification of the supposed image format with set_format
.
Fields§
§inner: R
§format: Option<ImageFormat>
§limits: Limits
Implementations§
§impl<'a, R> ImageReader<R>
impl<'a, R> ImageReader<R>
pub fn new(buffered_reader: R) -> ImageReader<R>
pub fn new(buffered_reader: R) -> ImageReader<R>
Create a new image reader without a preset format.
Assumes the reader is already buffered. For optimal performance,
consider wrapping the reader with a BufReader::new()
.
It is possible to guess the format based on the content of the read object with
with_guessed_format
, or to set the format directly with set_format
.
pub fn with_format(buffered_reader: R, format: ImageFormat) -> ImageReader<R>
pub fn with_format(buffered_reader: R, format: ImageFormat) -> ImageReader<R>
Construct a reader with specified format.
Assumes the reader is already buffered. For optimal performance,
consider wrapping the reader with a BufReader::new()
.
pub fn format(&self) -> Option<ImageFormat>
pub fn format(&self) -> Option<ImageFormat>
Get the currently determined format.
pub fn set_format(&mut self, format: ImageFormat)
pub fn set_format(&mut self, format: ImageFormat)
Supply the format as which to interpret the read image.
pub fn clear_format(&mut self)
pub fn clear_format(&mut self)
Remove the current information on the image format.
Note that many operations require format information to be present and will return e.g. an
ImageError::Unsupported
when the image format has not been set.
pub fn no_limits(&mut self)
pub fn no_limits(&mut self)
Disable all decoding limits.
pub fn into_inner(self) -> R
pub fn into_inner(self) -> R
Unwrap the reader.
pub fn into_decoder(self) -> Result<impl ImageDecoder + 'a, ImageError>
pub fn into_decoder(self) -> Result<impl ImageDecoder + 'a, ImageError>
Convert the reader into a decoder.
pub fn with_guessed_format(self) -> Result<ImageReader<R>, Error>
pub fn with_guessed_format(self) -> Result<ImageReader<R>, Error>
Make a format guess based on the content, replacing it on success.
Returns Ok
with the guess if no io error occurs. Additionally, replaces the current
format if the guess was successful. If the guess was unable to determine a format then
the current format of the reader is unchanged.
Returns an error if the underlying reader fails. The format is unchanged. The error is a
std::io::Error
and not ImageError
since the only error case is an error when the
underlying reader seeks.
When an error occurs, the reader may not have been properly reset and it is potentially hazardous to continue with more io.
§Usage
This supplements the path based type deduction from ImageReader::open()
with content based deduction.
This is more common in Linux and UNIX operating systems and also helpful if the path can
not be directly controlled.
let image = ImageReader::open("image.unknown")?
.with_guessed_format()?
.decode()?;
pub fn into_dimensions(self) -> Result<(u32, u32), ImageError>
pub fn into_dimensions(self) -> Result<(u32, u32), ImageError>
Read the image dimensions.
Uses the current format to construct the correct reader for the format.
If no format was determined, returns an ImageError::Unsupported
.
pub fn decode(self) -> Result<DynamicImage, ImageError>
pub fn decode(self) -> Result<DynamicImage, ImageError>
Read the image (replaces load
).
Uses the current format to construct the correct reader for the format.
If no format was determined, returns an ImageError::Unsupported
.
§impl ImageReader<BufReader<File>>
impl ImageReader<BufReader<File>>
pub fn open<P>(path: P) -> Result<ImageReader<BufReader<File>>, Error>
pub fn open<P>(path: P) -> Result<ImageReader<BufReader<File>>, Error>
Open a file to read, format will be guessed from path.
This will not attempt any io operation on the opened file.
If you want to inspect the content for a better guess on the format, which does not depend
on file extensions, follow this call with a call to with_guessed_format
.
Auto Trait Implementations§
impl<R> Freeze for ImageReader<R>where
R: Freeze,
impl<R> RefUnwindSafe for ImageReader<R>where
R: RefUnwindSafe,
impl<R> Send for ImageReader<R>where
R: Send,
impl<R> Sync for ImageReader<R>where
R: Sync,
impl<R> Unpin for ImageReader<R>where
R: Unpin,
impl<R> UnwindSafe for ImageReader<R>where
R: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request