15 个版本
0.6.0 | 2024 年 6 月 11 日 |
---|---|
0.5.0 | 2023 年 5 月 17 日 |
0.4.0 | 2022 年 9 月 30 日 |
0.3.3 | 2022 年 4 月 18 日 |
0.1.0 | 2019 年 3 月 3 日 |
#23 在 图像
1,704 每月下载量
用于 18 个crate(16 个直接使用)
125KB
1K SLoC
TinyBMP
文档
一个小型 BMP 解析器,主要针对嵌入式、无 std 环境,但可在任何地方使用。
此 crate 主要针对将 BMP 图像绘制到 embedded_graphics
DrawTarget
,但也可以用于解析 BMP 文件以供其他应用程序使用。
示例
将 BMP 图像绘制到嵌入式图形绘制目标
Bmp
结构与 embedded_graphics
的 Image
结构一起使用,以在任何绘制目标上显示 BMP 文件。
use embedded_graphics::{image::Image, prelude::*};
use tinybmp::Bmp;
// Include the BMP file data.
let bmp_data = include_bytes!("../tests/chessboard-8px-color-16bit.bmp");
// Parse the BMP file.
let bmp = Bmp::from_slice(bmp_data).unwrap();
// Draw the image with the top left corner at (10, 20) by wrapping it in
// an embedded-graphics `Image`.
Image::new(&bmp, Point::new(10, 20)).draw(&mut display)?;
使用像素迭代器
要访问图像数据以供其他应用程序使用,Bmp::pixels
方法返回一个遍历 BMP 文件中所有像素的迭代器。BMP 文件中的颜色将自动转换为 颜色类型 之一。
use embedded_graphics::{pixelcolor::Rgb888, prelude::*};
use tinybmp::Bmp;
// Include the BMP file data.
let bmp_data = include_bytes!("../tests/chessboard-8px-24bit.bmp");
// Parse the BMP file.
// Note that it is necessary to explicitly specify the color type which the colors in the BMP
// file will be converted into.
let bmp = Bmp::<Rgb888>::from_slice(bmp_data).unwrap();
for Pixel(position, color) in bmp.pixels() {
println!("R: {}, G: {}, B: {} @ ({})", color.r(), color.g(), color.b(), position);
}
访问单个像素
Bmp::pixel
可以用来获取单个像素的颜色。返回的颜色将自动转换为 颜色类型 之一,这些类型包含在 embedded_graphics
中。
use embedded_graphics::{pixelcolor::Rgb888, image::GetPixel, prelude::*};
use tinybmp::Bmp;
// Include the BMP file data.
let bmp_data = include_bytes!("../tests/chessboard-8px-24bit.bmp");
// Parse the BMP file.
// Note that it is necessary to explicitly specify the color type which the colors in the BMP
// file will be converted into.
let bmp = Bmp::<Rgb888>::from_slice(bmp_data).unwrap();
let pixel = bmp.pixel(Point::new(3, 2));
assert_eq!(pixel, Some(Rgb888::WHITE));
注意,当与 RLE4 或 RLE8 压缩索引位图一起工作时,您目前无法访问单个像素。在这些格式中,pixel()
函数将始终返回 None
。
访问原始图像数据
对于大多数应用,Bmp
提供的高级访问就足够了。但如果有必要进行低级访问,可以使用 RawBmp
结构来访问 BMP 的头部信息和颜色表。可以使用 from_slice
或通过使用 Bmp::as_raw
方法访问 Bmp
对象的底层原始对象来直接从图像数据创建 RawBmp
对象。
类似于 Bmp::pixel
,RawBmp::pixel
可以用来获取作为 u32
的原始像素颜色值。
use embedded_graphics::prelude::*;
use tinybmp::{RawBmp, Bpp, Header, RawPixel, RowOrder, CompressionMethod};
let bmp = RawBmp::from_slice(include_bytes!("../tests/chessboard-8px-24bit.bmp"))
.expect("Failed to parse BMP image");
// Read the BMP header
assert_eq!(
bmp.header(),
&Header {
file_size: 314,
image_data_start: 122,
bpp: Bpp::Bits24,
image_size: Size::new(8, 8),
image_data_len: 192,
channel_masks: None,
row_order: RowOrder::BottomUp,
compression_method: CompressionMethod::Rgb,
}
);
// Get an iterator over the pixel coordinates and values in this image and load into a vec
let pixels: Vec<RawPixel> = bmp.pixels().collect();
// Loaded example image is 8x8px
assert_eq!(pixels.len(), 8 * 8);
// Individual raw pixel values can also be read
let pixel = bmp.pixel(Point::new(3, 2));
// The raw value for a white pixel in the source image
assert_eq!(pixel, Some(0xFFFFFFu32));
支持的最低 Rust 版本
tinybmp 支持的最低 Rust 版本是 1.71
或更高版本。请确保您已安装正确的 Rust 版本,最好通过 https://rustup.rs。
许可
根据您的选择,许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给作品包含的任何贡献,都将根据上述协议双许可,不附加任何额外条款或条件。
依赖项
~3MB
~35K SLoC