C中的位填充

时间:2009-04-22 11:38:02

标签: c image bit packing pack

我正在尝试将RGB图像转换为ARGB图像,基本上只需为Alpha通道添加255。我想知道是否有任何包方法没有迭代这样做?因此迭代我的RGB数据并将255附加到每个像素。

1 个答案:

答案 0 :(得分:3)

C没有“方法”......不,这听起来不像标准库中的例程。我想你需要自己编写代码,使用类似的东西:

void setAlpha(unsigned char *rgba, int width, int height, int alpha)
{
  int x, y;

  for(y = 0; y < height; y++)
  {
    for(x = 0; x < width; x++, rgba += 4)
    {
      rgba[3] = (unsigned char) alpha;
    }
  }
}

基本假设:

  • 包装顺序为内存中的RGBA,即从像素的起点开始,偏移量为3字节。
  • 图像与左上角像素一起存储在初始地址,从右到左,从上到下依次排列。
  • 没有填充或任何内容

还要注意循环的顺序;由于缓存,这可以对现实世界的性能产生巨大影响。此代码按顺序触及内存中接近的像素,这称为“良好的局部性”。

将指针更改为指向下一个像素而不是声明地址(rgba[4 * y * width + 4 * x + 3])也是一种优化,(对我而言)很容易理解。