4个版本 (2个破坏性版本)
| 0.3.0 | 2024年1月30日 |
|---|---|
| 0.2.0 | 2024年1月26日 |
| 0.1.1 | 2024年1月25日 |
| 0.1.0 | 2024年1月25日 |
#496 in 图像
用于 pixel-weaver
17KB
144 行
rusty-ppm
一个crate,提供读写.ppm图像的功能。
该库提供
canvas模块:包含Canvas结构,它存储您正在处理的图像的像素数据,以及访问和修改其数据的必要函数。ppm_writer模块:包含将您的画布写入.ppm图像的函数。ppm_reader模块:包含读取.ppm图像并将其转换为Canvas的函数。utils模块:包含创建示例.ppm图像以及辅助函数。
内部工作原理
Canvas结构实现为一个单数组,而不是一个2D数组。经过一些测试,这种方法确实带来了一些性能提升。`ppm_writer`模块提供了写入函数,它接受一个`Canvas`并将其写入二进制或纯文本`.ppm`文件。`ppm_reader`模块提供了读取函数,它可以接受纯文本`.ppm`图像或二进制`.ppm`图像,并将其转换为用户可用的`Canvas`。
在`Canvas`内部的像素数据由`Vector3<u8>`组成,使用`cgmath`crate的`Vector3`结构。为了与图像交互,您很可能需要导入`cgmath`crate。
Canvas可以通過get和get_mut函数访问单个像素,使用行和列作为索引。iter和iter_mut函数将提供对整个图像的迭代器,从左上角开始,从左到右,再到下进行扫描。
示例基准测试
机器规格
OS: Pop!_OS 22.04 LTS x86_64
Host: 20QNS00Q00 ThinkPad P53
CPU: Intel i5-9400H (8) @ 4.300GHz
GPU1: Intel CoffeLake-H GT2 [UHD Graphics 630]
GPU2: NVIDIA Quadro T1000 Mobile
测试方法:每个函数都被计时,总共运行了10次。结果进行了平均。
写入/读取4k(3840×2160)图像(8,294,400像素)
- 平均
read_ppm读取速度(纯文本.ppm图像):277.071ms - 平均
read_ppm读取速度(二进制.ppm图像):35.603ms - 平均
write_ppm写入速度:48.378ms
写入/读取10,000 x 10,000图像(10亿像素)
- 平均
read_ppm读取速度(纯文本.ppm图像):3.928s - 平均
read_ppm读取速度(二进制.ppm图像):570.408ms - 平均
write_ppm写入速度:655.232ms
动机
在阅读“周末光线追踪”电子书时首次遇到.ppm格式,并创建了此crate来帮助我处理它。但除此之外,我还是觉得该格式的简单性很吸引人。
这也发现这是我的第一个crate,我认为这是一个很好的方式来开始我的发布过程。
注意
我没有测试使用Vector3<u8>与其他整数类型相比的性能,但据我所知,某些CPU架构可能使用不同类型的整数(如u32)表现更好。
依赖关系
~455KB