11 个稳定版本
1.10.1 | 2024年1月21日 |
---|---|
1.10.0 | 2023年10月17日 |
1.9.4 | 2022年9月18日 |
1.9.2 | 2022年6月12日 |
1.2.0 |
|
#5 in 图像
544,674 每月下载量
用于 132 个crate(直接使用38个)
62KB
1K SLoC
图像的二维切片
这是一个表示二维向量和其矩形切片的最小结构体。它旨在描述图像数据和图像区域(也称为位图描述符、具有间距或步长的帧)。当处理图像数据时,它非常有用,可以用作在crate之间交换图像像素的共同结构体。
在图形代码中,通常需要将 width
和 height
与一个 Vec
或像素切片一起传递,所有这些都作为独立的参数。这非常重复,并且可能导致错误。
此外,一些图形代码需要使用 stride
,这允许在不复制的情况下定义图像的子区域。这对于切片和贴图以及支持需要填充的位图(例如,将帧大小四舍五入到块大小的倍数的视频格式)非常有用。
这个crate是一个简单的结构体,它为底层的像素缓冲区添加了维度。这使得正确跟踪图像大小变得更容易,并允许通过一个函数参数而不是三个或四个参数来传递图像。为了方便,它还实现了像素/行的高效迭代器和使用 img[(x,y)]
进行索引的有效迭代器。
use imgref::*;
fn main() {
let img = Img::new(vec![0; 1000], 50, 20); // 1000 pixels of a 50×20 image
let new_image = some_image_processing_function(img.as_ref()); // Use imgvec.as_ref() instead of &imgvec for better efficiency
println!("New size is {}×{}", new_image.width(), new_image.height());
println!("And the top left pixel is {:?}", new_image[(0u32,0u32)]);
let first_row_slice = &new_image[0];
for row in new_image.rows() {
…
}
for px in new_image.pixels() {
…
}
// slice (x, y, width, height) by reference - no copy!
let fragment = img.sub_image(5, 5, 15, 15);
// create a vec of pixels without stride, for compatibility with software
// that expects pixels without any "gaps"
let (vec, width, height) = fragment.to_contiguous_buf();
}
类型别名
这些在参考中描述得更为详细。
ImgVec
它拥有自己的像素(存储在 Vec
中)。它类似于二维的 Vec
。使用此类型从函数中创建和返回新图像。
不要使用 &ImgVec
。相反,调用 ImgVec.as_ref()
从其中获取引用(需要显式调用 ImgRef.as_ref()
,因为 Rust 尚不支持 自定义转换。)
ImgRef
ImgRef
是指向某些 ImgVec
或切片拥有的像素的引用。它类似于二维的 &[]
。
使用此类型将只读图像作为函数的参数。请注意,ImgRef
是一个 Copy
类型。传递 ImgRef
,而不是 &ImgRef
。
要求
- 最新的稳定 Rust (1.42+)