代码之家  ›  专栏  ›  技术社区  ›  Zac

内存中像素数据的布局?

  •  1
  • Zac  · 技术社区  · 17 年前

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

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

    4 回复  |  直到 17 年前
        1
  •  6
  •   Georg Schölly Crazy Developer    17 年前

    • height * width 数量的 width (也可以 height )在免费区域之外。(当你考虑每像素的通道时,即使是中等大小的图像,#1也可能失败。)
    • #2的第二个缺点是数据不一定彼此相邻,这使得处理器更难将正确的内存页加载到缓存中。
        2
  •  2
  •   amarillion    17 年前

    pos += width;
    

    而不必引用指针。对于中小型图像,这可能更快。除非你处理的是数百Mb的图像,否则我会选择方法1。

        3
  •  1
  •   jesup    17 年前

    1. (也许)允许交错解码和交错JPEG(如果PNG支持的话)

    这种方法的问题(假设每一行都是一个分配)是更多的分配/空闲开销,可能会鼓励内存碎片化。

    除非你有充分的理由,否则使用样式1(单分配),并可能四舍五入到你正在使用的架构的“良好”边界(可能是4、8、16或甚至更多字节)。请注意,许多库函数可能会寻找没有填充的样式1——想想你将如何使用它,以及你将把它们传递到哪里。

        4
  •  0
  •   Mark Ransom    17 年前

    Windows本身使用方法1的变体。图像的每一行都被填充为4字节的倍数,颜色的顺序是B、G、R,而不是更正常的R、G、B。缓冲区的第一行是图像的底行。