如何确定一个位深度image::DynamicImage
生锈了?我在用着fltk-rs https://docs.rs/fltk/0.11.6/fltk/ function https://docs.rs/fltk/0.11.6/fltk/image/struct.RgbImage.html用于创建一个RgbImage
and RgbImage::new()
要求我指定要从中创建的 Rgb 字节数据的位深度。我在程序中加载的图像具有各种位深度,因此我需要能够动态确定图像的位深度值。
impl RgbImage
pub fn new(
data: &[u8],
w: u32,
h: u32,
depth: u32
) -> Result<RgbImage, FltkError>
这是一个典型的用例,我想知道 DynamicImage 的位深度:
image = "0.23.12"
fltk = "0.12.0"
use image::*;
use fltk::*;
//...
let img = image::open("my_img.png").unwrap(); //<---find the bit depth of this loaded image
let (imgx, imgy) = img.dimensions();
let fltk_rgb = RgbImage::new(&img.to_bytes(), imgx, imgy, 4).unwrap(); //<---then use bit depth value here
//...
正如@Ivan C 所说,最简单的方法是使用查找表match
陈述。
use image::DynamicImage;
pub fn bit_depth(image: &image::DynamicImage) -> u32 {
use DynamicImage::*;
match image {
ImageLuma8(_) => 1,
ImageLumaA8(_) => 2,
ImageRgb8(_) => 3,
ImageRgba8(_) => 4,
ImageBgr8(_) => 3,
ImageBgra8(_) => 4,
ImageLuma16(_) => 2,
ImageLumaA16(_) => 4,
ImageRgb16(_) => 6,
ImageRgba16(_) => 8,
}
}
也就是说,你必须要小心一点。 FLTK 对位深度对每个像素中颜色顺序的影响做出了一些假设(记录在案)here https://www.fltk.org/doc-1.3/classFl__RGB__Image.html,特别注意它假定 RGB 颜色顺序并将拒绝任何位深度 >4)。最好创建一个需要DynamicImage
并在必要时将其转换为适当的 FLTK 兼容表示形式image
crate(本质上是 ImageLuma8、ImageLumaA8、ImageRgb8 或 ImageRgba8 之一),然后对生成的图像类型的位深度进行硬编码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)