用于从RGB值数组中切割平面(就地)的算法

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然后再返回?任何非天真的算法?

Ram*_*rar 0

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)