【问题标题】:Bit packing in CC中的位打包
【发布时间】:2009-04-22 11:38:01
【问题描述】:

我正在尝试将 RGB 图像转换为 ARGB 图像,基本上只是为 alpha 通道添加 255。我想知道是否有任何打包方法可以在没有迭代的情况下做到这一点?所以要遍历我的 RGB 数据并将 255 附加到每个像素。

【问题讨论】:

  • 我们可以看看你的结构吗?
  • 它只是采用 unsigned char * 并将其转换为另一个 unsigned char * 每 4 个字节插入 255 个。

标签: c image bit packing pack


【解决方案1】:

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,即从像素开始到 alpha 字节的偏移量是 3。
  • 图像存储在初始地址的左上角像素,从右到左,从上到下的顺序。
  • 没有填充或任何东西

还要注意循环的顺序;由于缓存,这会对实际性能产生巨大影响。这段代码按顺序接触到内存中相近的像素,好叫“好局部性”。

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

【讨论】:

  • 这几乎就是我所拥有的,但减少了一些变量。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多