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

Download history 1527/week @ 2024-04-27 1963/week @ 2024-05-04 625/week @ 2024-05-11 556/week @ 2024-05-18 576/week @ 2024-05-25 635/week @ 2024-06-01 549/week @ 2024-06-08 625/week @ 2024-06-15 788/week @ 2024-06-22 410/week @ 2024-06-29 315/week @ 2024-07-06 440/week @ 2024-07-13 413/week @ 2024-07-20 465/week @ 2024-07-27 351/week @ 2024-08-03 405/week @ 2024-08-10

1,704 每月下载量
用于 18 个crate(16 个直接使用)

MIT/Apache

125KB
1K SLoC

TinyBMP

Build Status Crates.io Docs.rs embedded-graphics on Matrix

文档

一个小型 BMP 解析器,主要针对嵌入式、无 std 环境,但可在任何地方使用。

此 crate 主要针对将 BMP 图像绘制到 embedded_graphics DrawTarget,但也可以用于解析 BMP 文件以供其他应用程序使用。

示例

将 BMP 图像绘制到嵌入式图形绘制目标

Bmp 结构与 embedded_graphicsImage 结构一起使用,以在任何绘制目标上显示 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::pixelRawBmp::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-2.0 许可证定义,您有意提交给作品包含的任何贡献,都将根据上述协议双许可,不附加任何额外条款或条件。

依赖项

~3MB
~35K SLoC