4个版本 (2个破坏性更新)
新 0.3.0 | 2024年8月23日 |
---|---|
0.2.0 | 2024年8月21日 |
0.1.1 | 2024年8月21日 |
0.1.0 | 2024年8月21日 |
#235 in 图像
每月396次下载
135KB
3K SLoC
refimage
可序列化图像容器
此crate提供了一个类型擦除的图像容器(GenericImage
),由原始像素(u8
、u16
、f32
)的连续切片(所有者或引用)支持,具有任意色彩空间(灰度、拜耳阵列、RGB等)和色彩通道支持(最多255个)。出于实际考虑,图像大小限制为65536 × 65536。
GenericImage
非常强大,因为它支持以(key
、value
)对形式存在的元数据,可选注释。有效的元数据键不区分大小写,为80个字符的字符串,值是64位整数类型、32位和64位浮点数、最多4096个字符的字符串,或 std::time::{SystemTime, Duration}
。
GenericImage
还支持序列化和反序列化,并且可选地可以通过启用可选的 fitsio
功能以开放的 灵活图像传输系统(FITS) 格式保存。FITS文件支持无损压缩和任意元数据的保存。
GenericImage
的路径
一种获取 GenericImage
的方式是,Rust程序本身生成图像。在这种情况下,首先创建一个 ImageData
对象,该对象具有适当的、连续的、支持存储和图像格式
use refimage::{ColorSpace, ImageData, Debayer, DemosaicMethod, DynamicImageData, GenericImage};
use std::time::SystemTime;
let mut data = vec![0u8; 256]; // this is the backing store
// acquire(&mut data); // this function populates the backing store with the image pixels
let img = ImageData::from_mut_ref(&mut data, 16, 16, ColorSpace::Grbg).unwrap(); // Create a 4x4 image backed by the vector
let img = DynamicImageData::from(img); // convert the `ImageData` object to `DynamicImageData`
let img = img.debayer(DemosaicMethod::Nearest).expect("Could not debayer"); // debayer the image using nearest neighbor method
let mut img = GenericImage::new(SystemTime::now(), img); // Convert to a GenericImage
// insert the camera information as metadata
img.insert_key("CAMERA", ("Rust Test Program", "Name of the camera used to capture the image"));
let json = serde_json::to_string(&img).unwrap(); // serialize the image to JSON
let rimg: GenericImage = serde_json::from_str(&json).unwrap(); // deserialize to GenericImage
assert_eq!(&img, &rimg); // Confirm that deserialized image matches the original
另一种情况是,可以通过启用 image
功能,使用来自磁盘的 image
crate 加载图像
use refimage::DynamicImageData;
use image::open;
let img = open("/path/to/image.png").expect("Could not load image");
let img = DynamicImageData::try_from(img).expect("Could not convert image");
请注意,当前实现中,加载的图像必须不包含透明通道,以便转换成功。然而,image
包提供了移除透明通道的方法。可以为此类图像使用自定义颜色空间,但用户必须跟踪自定义颜色空间信息。
加载和存储 GenericImage
GenericImage
旨在以标准格式加载和存储,例如 bincode - 这直接来自 GenericImage
的序列化和反序列化。然而,对于更便携的应用程序,使用 fitsio
功能,可以通过导入 FitsWrite
特性将 GenericImage
存储为 FITS 文件。FITS 文件使用 fitsio
包存储,该包是 cfitsio
库的轻量级封装。
use refimage::{FitsCompression, FitsWrite, GenericImage}; // we need the FitsWrite trait to be able to use the `write_fits` method.
use std::path::Path;
let img: GenericImage = { todo!() }; // obtain a GenericImage
img.write_fits(Path::new("/path/to/fitsimage.fit"), FitsCompression::None, true) // no compression, overwrite
.expect("Could not write FITS file.");
依赖项
~2.7–6.5MB
~98K SLoC