2014-10-07 35 views
-1

我在另一个程序中使用此方法时出现分段错误。我已经证实我的指针是正确的,并且这个问题肯定在这个函数中。我假设我试图访问我实际上无法访问的内存。我的问题的解决方案,将不胜感激将像素减半像素

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; 

} 
+0

你的调试器说什么? – 2014-10-07 18:18:38

+0

它给予em没有任何迹象表明有什么错误,但是当编译出现seg故障时,明显是出现 – 2014-10-07 18:24:20

+2

您不需要使用“floor”。对于非负整数,“n/2”与“floor(0.5 * n)”相同。 – 2014-10-07 18:26:36

回答

0

我想通了。首先,我有一个seg故障,因为我从第一个数组的错误部分开始,在第一次迭代期间,我会从索引中减去一个并超出数组边界。其次,我以错误的顺序绘制了新图像,这是通过切换我的for循环标题的顺序来弥补的,我正在绘制图像而不是沿着它,并且我生成的图像看起来像是一团糟。我的代码现在可用,谢谢你的输入eveyrone

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并检查它是否不超过数组大小

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元素这是最容易出界外。

+0

这个建议解决了我的seg错误,我改变了for循环开始的地方。这种方法的要点是拍摄图像并将其缩小,当图像被打印时,它是原始图像的像素混乱,所以有一个问题得到解决,但这里是另一个我会很感激的帮助。我的算法有些不妥 – 2014-10-07 18:28:19

+0

你到底想要做什么?它看起来像是通过对像素进行平均来调整图像大小50%。 (RGB,调色板索引等)中的像素是什么颜色格式? – uesp 2014-10-07 18:34:28

+0

你是对的,我将图像减半。我相信这是RGB – 2014-10-07 18:43:25