我得到了一个1d数组,其中包含图像像素的颜色值。数组的大小为cols * rows。我想更改特定区域的颜色。给该函数调用一维数组,其大小,左,上,下,右以及所需的颜色。我试图做的是将1d数组的值复制到2d数组中,对2d数组进行操作,然后将新值复制回1d数组。我不断收到细分错误错误。这是代码:

void region_set( uint8_t array[],
         unsigned int cols,
         unsigned int rows,
         unsigned int left,
         unsigned int top,
         unsigned int right,
         unsigned int bottom,
         uint8_t color )
{

    if(!(left == right || top == bottom)){

        uint8_t Array2[cols][rows];

        int x, y;

        for(int i= 0; i < rows * cols; i++){
            x = i / rows;
            y = i % cols;
            Array2[y][x] = array[i];
        }

        for(int y=left; y < right-1; y++){
             for(int x = top; x < bottom-1 ; x++){
                Array2[y][x] = color;
            }
        }

        for(int i= 0; i < rows * cols; i++){
            x = i / rows;
            y = i % cols;
            array[i] = Array2[y][x];
        }

    }
}


我使用此代码来水平镜像图像,并且可以正常工作:

    for(int x=0; x<cols; x++){
 for(int y =0; y< rows/2; y++){

    holdVal=array[x + y * rows];
    array[x + y * rows] = array[(rows-1-y)* rows + x];
    array[(rows-1-y) * rows + x] = holdVal;

    }
}


然后,我对其进行了调整以尝试使其适用于region_set函数:

for(int y=left; y< right-1; y++){
         for(int x = top; x< bottom - 1; x++){
            array[x + y * cols] = color;
        }
    }


到目前为止没有运气。

最佳答案

你应该做 :

 int k = 0;
 for(int i = 0; i < rows; ++i)
 {
     for(int j = 0; j < cols; ++j)
     {
          array[k++] = Array[i][j];
          // or
          Array[i][j] = array[k++];
     }
 }


除此之外,您的代码看起来有些混乱,只需采用这种方法即可。
您似乎还写了[cols] [rows],而不是[rows] [cols]!

关于c - 分段故障C(从1d阵列到2d阵列并返回),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31094477/

10-11 16:38