用像素减半图像

时间:2014-10-07 18:15:09

标签: c pixel

当我在另一个程序中使用此方法时,我遇到了分段错误。我已经确认我的指针是正确的,问题肯定在这个函数中。我假设我试图访问我实际上无法访问的内存。我的问题的解决方案将不胜感激

uint8_t* half( const uint8_t array[], unsigned int cols, unsigned int rows ) {

int length = ((floor(cols/2)) * (floor(rows/2))); // change when we must ignore odd rows/cols
uint8_t* newimg = malloc(length * sizeof(uint8_t)); 
memset( newimg, 0, length);
int count = 0;
for(unsigned int c = 0; c < cols; c+=2){    
    for(unsigned int r = 0; r < rows; r+=2){
         uint8_t first = array[(c - 1) + ((r - 1) * cols)];
         uint8_t second = array[c + ((r - 1) * cols)];
         uint8_t third = array[(c - 1) + (r * cols)];
         uint8_t fourth = array[c + (r * cols)]; 
         uint8_t mean = (first + second + third + fourth)/4;
        newimg[count] = mean;
        count++;
            } 
} 

return newimg;

}

3 个答案:

答案 0 :(得分:1)

cr0时,请考虑此代码中发生的情况:

uint8_t first = array[(c - 1) + ((r - 1) * cols)];
uint8_t second = array[c + ((r - 1) * cols)];
uint8_t third = array[(c - 1) + (r * cols)];

0,0案例中,您尝试访问最有可能超出范围的数组的-1-cols-cols-1元素。

答案 1 :(得分:0)

我相信是在这部分引起的

     uint8_t first = array[(c - 1) + ((r - 1) * cols)];
     uint8_t second = array[c + ((r - 1) * cols)];
     uint8_t third = array[(c - 1) + (r * cols)];
     uint8_t fourth = array[c + (r * cols)]; 
     uint8_t mean = (first + second + third + fourth)/4;

其中计算结果可能应该更大,使用printf检查此打印计算结果并检查它是否超过数组大小

答案 2 :(得分:0)

我明白了。首先,我有一个seg错误,因为我从第一个数组的错误部分开始,在第一次迭代期间,我将从索引中减去一个并超出数组的范围。其次,我正在以错误的顺序绘制新图像,这是通过切换我的for循环标题的顺序来解决的,我正在绘制图像而不是沿着它,我生成的图像看起来像一个像素的混乱。我的代码现在有效,谢谢输入eveyrone