内存中像素数据的布局?

Zac*_*Zac 1 c c++ image

我正在为基于PNG的图像格式编写C++库.对我来说,一个停止点是我不确定我应该如何在内存中布置像素数据; 据我所知,有两种实用方法:

  1. 一个大小的数组(宽*高); 每个像素都可以通过数组[y*width + x]访问.
  2. 一个大小(高度)的数组,包含指向大小(宽度)数组的指针.

PNG(libpng)的标准参考实现使用上面的方法2,而我已经看到其他人使用方法1.是一个比另一个更好,或者每个方法都有自己的优点和缺点,必须妥协被制作?此外,大多数图形显示系统使用哪种格式(可能是为了便于将我的库输出用于其他API)?

dir*_*tly 6

脱离我的头顶:

  • 让我选择#2的一件事是你的记忆要求有点放松.如果你要去#1,系统将需要能够分配height * width大量的连续内存.然而,在#2的情况下,它可以自由地分配较小的连续大小的内存块width(也可以height是空闲的).(当您考虑每个像素的通道时,即使是中等大小的图像,#1也可能会失败.)
  • 此外,如果为了图像处理目的(指针交换就足够了),交换行(或列)时可能稍微好一点.
  • #2的缺点当然是额外的间接级别,它会渗透到每个访问和要维护的指针数组中.但考虑到今天的处理器速度和内存,这几乎不是问题.
  • #2的第二个缺点是数据不一定是彼此相邻的,这使得处理器更难以将正确的内存页加载到缓存中.