我有一个字节 RGB 值的平面数组R1 G1 B1 R2 G2 B2 R3 G3 B3 ... Rn Gn Bn
。所以我的数据看起来像:
char imageData[WIDTH * HEIGHT * 3];
但我想将 WIDTH*HEIGHT 数组传递给需要该数据的单个平面的现有 C 库。这将是仅包含 R 值(或仅包含 G,或仅包含 B)的序列。
分配一个新数组并复制数据很容易(废话)。但图像非常大。如果它不是一个 C 库,而是采用某种迭代接口来巧妙地进行“切片”遍历,那就太好了。但我无法编辑我正在调用的代码...它需要一个指向连续内存块的普通旧指针。
但是我有这个数组的写访问权限。创建一个将其分类为颜色平面的例程是可行的。我还需要一个反向转换来将其放回原处,但根据定义,将其排序到平面的相同方法可以应用于取消排序。
我如何有效地(就地)将该数组转换为R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn
然后又回来?有什么非朴素的算法吗?
如果您只需要一架飞机,这似乎很容易。如果您需要全部 3 个,那么您可能会更幸运地使用更复杂的算法。
void PlanarizeR(char * imageData, int width, int height)
{
char *in = imageData;
int pixelCount = width * height;
for (int i = 0; i < pixelCount; ++i, in+=3)
std::swap(*in, imageData[i])
}
从高到低向后运行循环来反转该过程应该不会太难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)