#ppm #image #read-write #reader-writer #write #read #graphics

rusty-ppm

一个简单的PPM图像读取和写入器

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

MIT 许可证

17KB
144

rusty-ppm

一个crate,提供读写.ppm图像的功能。

sample_binary_image

该库提供

  • 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可以通過getget_mut函数访问单个像素,使用行和列作为索引。iteriter_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