#color-space #metadata #fits #channel #pixel #key #generic-image

refimage

图像库。提供基本的图像处理以及常见图像格式的编码/解码器。

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 图像

Download history 384/week @ 2024-08-17

每月396次下载

MIT/Apache

135KB
3K SLoC

refimage

crates.io Documentation

可序列化图像容器

此crate提供了一个类型擦除的图像容器(GenericImage),由原始像素(u8u16f32)的连续切片(所有者或引用)支持,具有任意色彩空间(灰度、拜耳阵列、RGB等)和色彩通道支持(最多255个)。出于实际考虑,图像大小限制为65536 × 65536。

GenericImage 非常强大,因为它支持以(keyvalue)对形式存在的元数据,可选注释。有效的元数据键不区分大小写,为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