我正在为基于 PNG 的图像格式编写 C++ 库。对我来说,一个停顿点是我不确定应该如何在内存中布置像素数据;据我所知,有两种实用的方法:
- 大小为(宽*高)的数组;每个像素都可以通过数组[y*width + x]访问。
- 一个大小(高度)数组,包含指向大小(宽度)数组的指针。
PNG (libpng) 的标准引用实现使用上面的方法 2,而我看到其他人使用方法 1。是一个比另一个更好,还是每个方法都有自己的优缺点,到哪里必须做出妥协?此外,大多数图形显示系统使用哪种格式(可能是为了便于将我的库的输出用于其他 API)?
最佳答案
在我的脑海中:
- 让我选择#2 的一件事是您的内存要求有点宽松。如果您选择 #1,系统将需要能够分配
height * width
数量的连续 内存。然而,在 #2 的情况下,它可以自由地从空闲区域分配较小的连续内存块,这些内存块的大小为width
(也可以是height
)。 (当您将每个像素的 channel 考虑在内时,即使是中等大小的图像,#1 也可能会失败。) - 此外,如果需要进行图像处理(指针交换就足够了),交换行(或列)可能会稍微好一些。
- #2 的缺点当然是一个额外的间接级别,它渗透到每个访问和要维护的指针数组中。但考虑到当今的处理器速度和内存,这几乎不是问题。
- #2 的第二个缺点是数据不一定彼此相邻,这使得处理器更难将正确的内存页面加载到缓存中。
关于c++ - 像素数据在内存中的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854541/