#[repr(C)]pub struct Image<T, const CHANNELS: usize> { /* private fields */ }Expand description
A image with a variable number of channels, and a nonzero size.
Implementations§
Source§impl<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>> Image<T, CHANNELS>
impl<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>> Image<T, CHANNELS>
Source§impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 2>
impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 2>
Sourcepub fn blur(&mut self, radius: usize)
Available on crate feature blur only.
pub fn blur(&mut self, radius: usize)
blur only.Blur a image. This will allocate a Image<Box<[u32]>, 1>.
If you want no copy, but slower if you dont have a simd-able cpu, check out Image::blur_in.
let mut i = Image::alloc(300, 300);
// draw a sqar
i.poly((150., 150.), 4, 100.0, 0.0, [255]);
// give it some blur
i.blur(25);Source§impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 3>
impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 3>
Sourcepub fn blur(&mut self, radius: usize)
Available on crate feature blur only.
pub fn blur(&mut self, radius: usize)
blur only.Blur a image. This will allocate a Image<Box<[u32]>, 1>.
If you want no copy, but slower if you dont have a simd-able cpu, check out Image::blur_in.
let mut i = Image::alloc(300, 300);
// draw a sqar
i.poly((150., 150.), 4, 100.0, 0.0, [255]);
// give it some blur
i.blur(25);Source§impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 4>
impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, 4>
Sourcepub fn blur(&mut self, radius: usize)
Available on crate feature blur only.
pub fn blur(&mut self, radius: usize)
blur only.Blur a image. This will allocate a Image<Box<[u32]>, 1>.
If you want no copy, but slower if you dont have a simd-able cpu, check out Image::blur_in.
let mut i = Image::alloc(300, 300);
// draw a sqar
i.poly((150., 150.), 4, 100.0, 0.0, [255]);
// give it some blur
i.blur(25);Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn box(
&mut self,
(x1, y1): (u32, u32),
width: u32,
height: u32,
c: [u8; CHANNELS],
)
pub fn box( &mut self, (x1, y1): (u32, u32), width: u32, height: u32, c: [u8; CHANNELS], )
Draw a bordered box
let mut b = Image::alloc(10, 9);
b.as_mut().r#box((1, 1), 7, 6, [255]);Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn border_circle(
&mut self,
(xc, yc): (i32, i32),
radius: i32,
c: [u8; CHANNELS],
)
pub fn border_circle( &mut self, (xc, yc): (i32, i32), radius: i32, c: [u8; CHANNELS], )
Draws a circle, using the Bresenham’s circle algorithm.
let mut i = Image::alloc(50, 50);
i.border_circle((25, 25), 20, [255]);Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn line(&mut self, a: (i32, i32), b: (i32, i32), color: [u8; CHANNELS])
pub fn line(&mut self, a: (i32, i32), b: (i32, i32), color: [u8; CHANNELS])
Draw a line from point a to point b.
Points not in bounds will not be included.
Sourcepub fn thick_line(
&mut self,
a: impl Into<Vec2>,
b: impl Into<Vec2>,
stroke: f32,
color: [u8; CHANNELS],
)
pub fn thick_line( &mut self, a: impl Into<Vec2>, b: impl Into<Vec2>, stroke: f32, color: [u8; CHANNELS], )
Draw a thick line from point a to point b.
Prefer Image::line when possible.
Points not in bounds will not be included.
Uses Image::quad.
let mut i = Image::alloc(10, 10);
i.thick_line((2.0, 2.0), (8.0, 8.0), 2.0, [255]);Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn points(&mut self, poly: &[(i32, i32)], c: [u8; CHANNELS])
pub fn points(&mut self, poly: &[(i32, i32)], c: [u8; CHANNELS])
Draws a filled polygon from a slice of points. Please close your poly. (first == last)
Borrowed from imageproc, modified for less allocations.
let mut i = Image::alloc(10, 10);
i.points(&[(1, 8), (3, 1), (8, 1), (6, 6), (8, 8), (1, 8)], [255]);Sourcepub fn quad(
&mut self,
a: (i32, i32),
b: (i32, i32),
c: (i32, i32),
d: (i32, i32),
col: [u8; CHANNELS],
)
pub fn quad( &mut self, a: (i32, i32), b: (i32, i32), c: (i32, i32), d: (i32, i32), col: [u8; CHANNELS], )
Draws a filled quadrilateral.
This currently just uses Image::points, but in the future this may change.
Sourcepub fn poly(
&mut self,
pos: impl Into<Vec2>,
sides: usize,
radius: f32,
rotation: f32,
c: [u8; CHANNELS],
)
pub fn poly( &mut self, pos: impl Into<Vec2>, sides: usize, radius: f32, rotation: f32, c: [u8; CHANNELS], )
Draws a regular convex polygon with a specified number of sides, a radius, and a rotation (radians).
Prefer Image::circle over poly(.., 600, ..).
Calls into Image::tri and Image::quad.
let mut i = Image::alloc(300, 300);
// draw a enneagon
// at x150, y150 │ unrotated white
// with a radius of ─┼──╮ │ │
i.poly((150., 150.), 9, 100.0, 0.0, [255]);Sourcepub fn border_poly(
&mut self,
pos: impl Into<Vec2>,
sides: usize,
radius: f32,
rotation: f32,
stroke: f32,
c: [u8; CHANNELS],
)
pub fn border_poly( &mut self, pos: impl Into<Vec2>, sides: usize, radius: f32, rotation: f32, stroke: f32, c: [u8; CHANNELS], )
Draw a bordered polygon.
Prefer Image::border_circle to draw circles.
See also Image::poly.
let mut i = fimg::Image::alloc(100, 100);
i.border_poly((50., 50.), 5, 25., 0., 7., [255]);Source§impl<const N: usize, T> Image<T, N>
impl<const N: usize, T> Image<T, N>
Sourcepub fn text<const P: usize>(
&mut self,
x: u32,
y: u32,
size: f32,
font: &Font,
text: &str,
color: [u8; P],
)where
Image<T, N>: Text<P>,
Available on crate feature text only.
pub fn text<const P: usize>(
&mut self,
x: u32,
y: u32,
size: f32,
font: &Font,
text: &str,
color: [u8; P],
)where
Image<T, N>: Text<P>,
text only.Draw text.
let font = fontdue::Font::from_bytes(
&include_bytes!("../../data/CascadiaCode.ttf")[..],
fontdue::FontSettings {
scale: 200.0,
..Default::default()
},
).unwrap();
let mut i: Image<_, 4> = Image::alloc(750, 250).boxed();
i.text(50, 10, 200.0, &font, "hello", [0, 0, 0, 255]);Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn tri<F: Float<f32>>(
&mut self,
a: impl Into<Vector2<F>>,
b: impl Into<Vector2<F>>,
c: impl Into<Vector2<F>>,
col: [u8; CHANNELS],
)
pub fn tri<F: Float<f32>>( &mut self, a: impl Into<Vector2<F>>, b: impl Into<Vector2<F>>, c: impl Into<Vector2<F>>, col: [u8; CHANNELS], )
Draw a (filled) triangle
let mut a = Image::alloc(10, 10);
// draw a triangle
a.as_mut().tri::<f32>(
(3.0, 2.0), // point a
(8.0, 7.0), // point b
(1.0, 8.0), // point c
[255] // white
);Source§impl<T, const C: usize> Image<T, C>
impl<T, const C: usize> Image<T, C>
Sourcepub fn crop<'a, U: 'a>(
&'a self,
width: u32,
height: u32,
) -> impl Cropper<&'a [U], C>
pub fn crop<'a, U: 'a>( &'a self, width: u32, height: u32, ) -> impl Cropper<&'a [U], C>
Crop a image.
The signature looks something like: i.crop(width, height).from(top_left_x, top_left_y), which gives you a SubImage<&[T], _>
If you want a owned image, i.crop(w, h).from(x, y).own() gets you a back.Image<Box<[T], _>>
let mut i = Image::<_, 1>::build(4, 3).buf([
1, 2, 3, 1,
4, 5, 6, 2,
7, 8, 9, 3,
]);
let c = i.crop(2, 2).from(1, 1);
assert_eq!(c.pixel(0, 0), [5]);
assert_eq!(c.pixel(1, 1), [9]);
assert_eq!(
c.own().bytes(),
&[5, 6,
8, 9]
);§Panics
if width == 0 || height == 0
Source§impl<T: AsRef<[u8]>> Image<T, 4>
impl<T: AsRef<[u8]>> Image<T, 4>
Sourcepub fn send(&self, dev: &Device, q: &Queue, usage: TextureUsages) -> Texture
Available on crate feature wgpu-convert only.
pub fn send(&self, dev: &Device, q: &Queue, usage: TextureUsages) -> Texture
wgpu-convert only.Upload this image to the gpu, returning a wgpu::Texture.
Source§impl Image<Box<[u8]>, 4>
impl Image<Box<[u8]>, 4>
Sourcepub fn download(
dev: &Device,
q: &Queue,
texture: &Texture,
(width, height): (NonZeroU32, NonZeroU32),
) -> Self
Available on crate feature wgpu-convert only.
pub fn download( dev: &Device, q: &Queue, texture: &Texture, (width, height): (NonZeroU32, NonZeroU32), ) -> Self
wgpu-convert only.Downloads a purportedly TextureFormat::Rgba8Unorm image from the gpu.
§Panics
When a “error occurs while trying to async map a buffer”.
Source§impl Image<&[u8], 3>
impl Image<&[u8], 3>
Sourcepub unsafe fn repeated(
&self,
out_width: u32,
out_height: u32,
) -> Image<Vec<u8>, 3>
pub unsafe fn repeated( &self, out_width: u32, out_height: u32, ) -> Image<Vec<u8>, 3>
Tile self till it fills a new image of size x, y
§Safety
UB if self’s width is not a multiple of x, or self’s height is not a multiple of y
let x: Image<&[u8], 3> = Image::build(8, 8).buf(include_bytes!("../benches/3_8x8.imgbuf"));
let tiled = unsafe { x.repeated(48, 48) }; // repeat 6 timesSource§impl<T, const CHANNELS: usize> Image<T, CHANNELS>
impl<T, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub const unsafe fn new(
width: NonZeroU32,
height: NonZeroU32,
buffer: T,
) -> Self
pub const unsafe fn new( width: NonZeroU32, height: NonZeroU32, buffer: T, ) -> Self
create a new image
§Safety
does not check that buffer.len() == w * h * C
using this with invalid values may result in future UB
Sourcepub fn take_buffer(self) -> T
pub fn take_buffer(self) -> T
consumes the image, returning the image buffer
Sourcepub unsafe fn buffer_mut(&mut self) -> &mut T
pub unsafe fn buffer_mut(&mut self) -> &mut T
Source§impl<T, const CHANNELS: usize> Image<T, CHANNELS>
impl<T, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn chunked<'a, U: 'a>(
&'a self,
) -> impl DoubleEndedIterator<Item = &'a [U; CHANNELS]> + ExactSizeIterator
pub fn chunked<'a, U: 'a>( &'a self, ) -> impl DoubleEndedIterator<Item = &'a [U; CHANNELS]> + ExactSizeIterator
Returns a iterator over every pixel
Sourcepub fn flatten<U>(&self) -> &[[U; CHANNELS]]
pub fn flatten<U>(&self) -> &[[U; CHANNELS]]
Flatten the chunks of this image into a slice of slices.
Sourcepub fn get_pixel<U: Copy>(&self, x: u32, y: u32) -> Option<[U; CHANNELS]>
pub fn get_pixel<U: Copy>(&self, x: u32, y: u32) -> Option<[U; CHANNELS]>
Get a pixel. Optionally. Yeah!
Sourcepub fn replace<U: Copy>(
&mut self,
x: u32,
y: u32,
f: impl FnOnce([U; CHANNELS]) -> [U; CHANNELS],
) -> Option<[U; CHANNELS]>
pub fn replace<U: Copy>( &mut self, x: u32, y: u32, f: impl FnOnce([U; CHANNELS]) -> [U; CHANNELS], ) -> Option<[U; CHANNELS]>
Returns a [PixelEntry]
Sourcepub unsafe fn pixel_mut<U: Copy>(
&mut self,
x: u32,
y: u32,
) -> &mut [U; CHANNELS]
pub unsafe fn pixel_mut<U: Copy>( &mut self, x: u32, y: u32, ) -> &mut [U; CHANNELS]
Return a mutable reference to a pixel at (x, y).
§Safety
- UB if x, y is out of bounds
- UB if buffer is too small
Sourcepub fn get_pixel_mut<U>(&mut self, x: u32, y: u32) -> Option<&mut [U; CHANNELS]>
pub fn get_pixel_mut<U>(&mut self, x: u32, y: u32) -> Option<&mut [U; CHANNELS]>
Returns a mutable reference to a pixel at (x, y), if (x, y) is in bounds.
Sourcepub fn cols<U: Copy>(
&self,
) -> impl DoubleEndedIterator + ExactSizeIterator<Item = impl ExactSizeIterator + DoubleEndedIterator<Item = [U; CHANNELS]> + '_>
pub fn cols<U: Copy>( &self, ) -> impl DoubleEndedIterator + ExactSizeIterator<Item = impl ExactSizeIterator + DoubleEndedIterator<Item = [U; CHANNELS]> + '_>
iterator over columns returned iterator returns a iterator for each column
┌ ┐┌ ┐┌ ┐
│1││2││3│
│4││5││6│
│7││8││9│
└ ┘└ ┘└ ┘let img: Image<&[u8],1> = Image::build(2, 3).buf(&[
1, 5,
2, 4,
7, 9
]);
assert_eq!(
img.cols().map(|x| x.collect::<Vec<_>>()).collect::<Vec<_>>(),
[[[1], [2], [7]], [[5], [4], [9]]]
);Sourcepub fn rows<'a, U: 'a>(
&'a self,
) -> impl ExactSizeIterator + DoubleEndedIterator<Item = &'a [[U; CHANNELS]]>
pub fn rows<'a, U: 'a>( &'a self, ) -> impl ExactSizeIterator + DoubleEndedIterator<Item = &'a [[U; CHANNELS]]>
iterator over rows returns a iterator over each row
[ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ]let img: Image<&[u8],1> = Image::build(2, 3).buf(&[
1, 5,
2, 4,
7, 9
]);
assert_eq!(
img.rows().collect::<Vec<_>>(),
[[[1], [5]], [[2], [4]], [[7], [9]]]
);Sourcepub fn ordered(
&self,
) -> impl ExactSizeIterator + DoubleEndedIterator<Item = (u32, u32)> + use<T, CHANNELS>
pub fn ordered( &self, ) -> impl ExactSizeIterator + DoubleEndedIterator<Item = (u32, u32)> + use<T, CHANNELS>
Itearte the pixels of this image in parse order.
use Image::chunked if you just want the pixels.
Sourcepub fn serpent(
&self,
) -> impl ExactSizeIterator + Iterator<Item = (u32, u32)> + use<T, CHANNELS>
pub fn serpent( &self, ) -> impl ExactSizeIterator + Iterator<Item = (u32, u32)> + use<T, CHANNELS>
Iterate the pixels of this image in serpentine order.
§Safety
The points are guaranteed to be on the image.
Sourcepub unsafe fn pixels_of<'l, U: Copy>(
&'l self,
iterator: impl ExactSizeIterator<Item = (u32, u32)> + 'l,
) -> impl ExactSizeIterator<Item = [U; CHANNELS]> + 'l
pub unsafe fn pixels_of<'l, U: Copy>( &'l self, iterator: impl ExactSizeIterator<Item = (u32, u32)> + 'l, ) -> impl ExactSizeIterator<Item = [U; CHANNELS]> + 'l
Source§impl<T: AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn cloner(&self) -> ImageCloner<'_, CHANNELS>
pub fn cloner(&self) -> ImageCloner<'_, CHANNELS>
Procure a ImageCloner.
Source§impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS>
Sourcepub fn chunked_mut(&mut self) -> impl Iterator<Item = &mut [u8; CHANNELS]>
pub fn chunked_mut(&mut self) -> impl Iterator<Item = &mut [u8; CHANNELS]>
Returns a iterator over every pixel, mutably
Sourcepub fn flatten_mut(&mut self) -> &mut [[u8; CHANNELS]]
pub fn flatten_mut(&mut self) -> &mut [[u8; CHANNELS]]
Flatten the chunks of this image into a mutable slice of slices.
Source§impl<const CHANNELS: usize, T: ?Sized> Image<Box<T>, CHANNELS>
impl<const CHANNELS: usize, T: ?Sized> Image<Box<T>, CHANNELS>
Sourcepub fn leak(self) -> Image<&'static mut T, CHANNELS>
pub fn leak(self) -> Image<&'static mut T, CHANNELS>
Consumes and leaks this image, returning a reference to the image.
Trait Implementations§
Source§impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> BlendingOverlay<Image<U, B>> for Image<T, A>
impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> BlendingOverlay<Image<U, B>> for Image<T, A>
Source§unsafe fn overlay_blended(&mut self, with: &Image<U, B>) -> &mut Self
unsafe fn overlay_blended(&mut self, with: &Image<U, B>) -> &mut Self
Source§impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> BlendingOverlayAt<Image<U, B>> for Image<T, A>
impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> BlendingOverlayAt<Image<U, B>> for Image<T, A>
Source§impl<T: Clone, const CHANNELS: usize> Clone for Image<T, CHANNELS>
impl<T: Clone, const CHANNELS: usize> Clone for Image<T, CHANNELS>
Source§fn clone(&self) -> Self
fn clone(&self) -> Self
Returns a duplicate of this image.
let new_i = i.clone();If you find yourself in the pattern of
let mut i = i.clone();
unsafe { i.rot_90() };STOP!
Instead use
let i = unsafe { i.cloner().rot_90() };1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<const CHANNELS: usize> Copy for Image<&[u8], CHANNELS>
impl<T: Eq, const CHANNELS: usize> Eq for Image<T, CHANNELS>
impl<T, const CHANNELS: usize> StructuralPartialEq for Image<T, CHANNELS>
Auto Trait Implementations§
impl<T, const CHANNELS: usize> Freeze for Image<T, CHANNELS>where
T: Freeze,
impl<T, const CHANNELS: usize> RefUnwindSafe for Image<T, CHANNELS>where
T: RefUnwindSafe,
impl<T, const CHANNELS: usize> Send for Image<T, CHANNELS>where
T: Send,
impl<T, const CHANNELS: usize> Sync for Image<T, CHANNELS>where
T: Sync,
impl<T, const CHANNELS: usize> Unpin for Image<T, CHANNELS>where
T: Unpin,
impl<T, const CHANNELS: usize> UnwindSafe for Image<T, CHANNELS>where
T: 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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.