0

为一个基本问题道歉。我在这里这里for检查了循环,例如,如果我们分析第一个代码:

for(int i = 0; i < CFDataGetLength(pixelData); i += 4) {
    pixelBytes[i]   // red
    pixelBytes[i+1] // green
    pixelBytes[i+2] // blue
    pixelBytes[i+3] // alpha
}

变量i从 0 增加到数组的长度pixelData,步长为 4。

但是如何pixelBytes[i+3]访问图像的 alpha 通道呢?因此,例如如果i=5,如何pixelBytes[5+3]等于 alpha 通道而不是仅访问 的第 8 个元素pixelBytes

4

4 回答 4

4

如果i从零开始,每次递增 4,它怎么可能等于 5?

据推测,存储该结构时每个通道占用一个字节,首先是红色,然后是绿色,然后是蓝色,然后是 alpha,然后是红色,依此类推。for循环通过每次递增 4 来模拟这种结构,i因此如果第一次通过pixelBytes[i+1]是第一个绿色值,那么第二次通过它将是四个字节之后,因此是第二个绿色值。

于 2013-06-14T17:13:23.640 回答
2

有时它有助于展开一张纸上的环

// First pixel
RGBA 
^    Index 0 = i(0) + 0
 ^   Index 1 = i(0) + 1
  ^  Index 2 = i(0) + 2
   ^ Index 3 = i(0) + 3

            i + 4
     // Second pixel
RGBA RGBA      
     ^    Index 4 = i(4) + 0
      ^   Index 5 = i(4) + 1
       ^  Index 6 = i(4) + 2
        ^ Index 7 = i(4) + 3

            i + 4
          // Third pixel
RGBA RGBA RGBA      
          ^    Index 8 = i(8) + 0
           ^   Index 9 = i(8) + 1
            ^  Index 10 = i(8) + 2
             ^ Index 11 = i(8) + 3
于 2013-06-14T17:23:25.207 回答
0

一个典型的 32 位像素由四个通道组成,alpha、red、green 和 blue。我的猜测是 pixelbytes 是这些的字节缓冲区,所以:

pixelbuffer[0] = r
pixelbuffer[1] = g
pixelbuffer[2] = b
pixelbuffer[3] = a

正如你的代码所说。在每次迭代中,它向计数器添加四个字节(8 位 * 4 = 32 位),等于下一个 32 位像素的偏移量。可以通过字节偏移量 (i + <0-3>) 访问各个组件。

于 2013-06-14T17:16:02.743 回答
0

您有以 RGBA 格式存储的颜色。在 RGBA 格式中,一种颜色存储在 4 个字节中,第一个字节是红色 (R) 的值,第二个是绿色 (G),第三个是蓝色 (B),最后一个是 alpha (A)。

您自己的代码在其注释中很好地解释了这一点:

pixelBytes[i]   // red
pixelBytes[i+1] // green
pixelBytes[i+2] // blue
pixelBytes[i+3] // alpha

但重要的是要注意,如果 i 不是 4 的倍数,您将无法再正确读取颜色。

虽然代码不存在,但 pixelBytes 很可能是一个大小等于颜色总数乘以 4 的数组,这与用于表示颜色的总字节数相同(因为存储了每种颜色4 个字节)

于 2013-06-14T17:16:11.307 回答