c++ - 像素数据在内存中的布局?

标签 c++ c image

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

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

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

最佳答案

在我的脑海中:

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

关于c++ - 像素数据在内存中的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854541/

相关文章:

C++ if 语句重新排序

c - void 函数不返回任何值

通过将字符串传递给函数使用 strtok 分割标记时代码崩溃

c - 在 C 中编译 Lisp 解释器时收到警告

css - 小 div 内的大图像,没有裁剪或纵横比变化

javascript - 如何在 ASP.NET Response.BinaryWrite 生成的 Javascript 中处理字节数组图像

c++ - 计算点云中每个点的法线?

c++ - 在另一个类中创建对象(无继承)

c++ - ffmpeg Bmp 到 yuv : Crash at sws_scale

java - 在Java中将PDF转换为缩略图