垂直翻转图像

时间:2015-03-04 04:20:49

标签: image

我试图垂直翻转图像(在C中)。这是我到目前为止所做的。我认为它在理论上有效,但是当我运行它时,我会遇到分段错误。我几天前设法修复了这个错误,但我没有保存它。我看到的这个功能在我尝试运行时会出现分段错误。有没有办法解决它,以便它不会给出该错误并垂直翻转图像?

void vertical( uint8_t array[], 
            unsigned int cols, 
            unsigned int rows )
{
   unsigned int top = 0;
   unsigned int bottom = rows-1;
   for(int r = 0; r < cols; r++)
{
   while(top != bottom && bottom > top)
    {
      int index1= r * cols + top;
      int index2= r * cols + bottom;

      int temp= array[index1];
      array[index1]= array[index2];
      array[index2] = temp;        
      bottom++;
      top++;
    } 

      top =0;
      bottom= rows-1;
 } 

}

1 个答案:

答案 0 :(得分:1)

int index1= r * cols + top;关闭,因为top是一行,它应该乘以列数,r是当前正在翻转的列。所以它应该是int index1 = top * cols + r;。但是r是一个令人困惑的名称,因为它是一个列索引。

正如其他人评论的那样,底部应该在循环中递减。 --bottom;以避免在数组边界之外进行索引,这会导致段错误。

此条件while(top != bottom && bottom > top)相当于while (bottom > top)

通常最好(在C中)首先迭代行中的列,因为C是行主要的,它也简化了代码,并允许您避免从头开始计算索引。每个外部迭代通过添加/减去一行中的列数向下/向上移动整行。

void vertical(uint8_t array[], unsigned int cols, unsigned int rows) {
   int top = 0;
   int bottom = (rows - 1) * cols;

   while (top < bottom) {

     for (int c = 0; c < cols; ++c) {
       int temp = array[top + c];
       array[top + c] = array[bottom + c];
       array[bottom + c] = temp;
     }

     top += cols;
     bottom -= cols;
   }
}