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