Hos*_*ork 7 c c++ algorithm image-processing slice
我有一个平坦的字节RGB值数组R1 G1 B1 R2 G2 B2 R3 G3 B3 ... Rn Gn Bn
.所以我的数据看起来像:
char imageData[WIDTH * HEIGHT * 3];
Run Code Online (Sandbox Code Playgroud)
但我想将WIDTH*HEIGHT数组传递给现有的C库,该库需要这个数据的单个平面.这将只是R值(或只是G,或只是B)的序列.
分配新数组并复制数据(duh)很容易.但是图像非常大.如果它不是一个C库,而是采用某种迭代接口来精细化"切片"遍历,那就太棒了.但是我无法编辑我正在调用的代码......它需要一个指向一块顺序内存的普通旧指针.
但是我有对这个数组的写访问权限.创建一个将其分类为彩色平面的例程是可行的.我还需要一个可以反转的反向转换,但根据定义,将它分类为平面的相同方法可以应用于取消它.
我(在适当的位置)如何有效地将此阵列转换为R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn
然后再返回?任何非天真的算法?
char *imageData = malloc (WIDTH * HEIGHT * 3 * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
此函数执行此操作 R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn,,
char *toRGB(char *imageData, int WIDTH, int HEIGHT){
int len = WIDTH * HEIGHT;
char *RGB = malloc (len * sizeof(char));
int i, j = 0,flag = 0;
for(i=0 ; i<=len ; i++, j+=3){
if(j<len)
RGB[i] = imageData[j];
else{
switch(flag){
case 0: j=-2; flag=1; break; // j=-2 the next iteration will start at j=1
case 1: j=-1; break; // j=-1 the next iteration will start at j=2
}
}
}
return RGB;
}
Run Code Online (Sandbox Code Playgroud)