获取一张新图片,该图片是该地区的副本。空区域返回 空指针。如果内存分配失败,则返回null 指针。调用者负责释放返回的数组。
该区域包含[left, right-1]
包含的所有列,
以及[top, bottom-1]
包含的所有行。
在每种情况下,您都可以认为left <= right
和top <= bottom
:
不需要为此进行测试。
该地区的面积为(right-left) * (bottom-top)
像素
暗示如果left == right
或top == bottom
,则该区域没有
区域和定义为&#34;空&#34;。每个功能都记录了如何处理
空白区域。
此解决方案在终端中引发错误,称为“内存损坏”#34;它指向我的malloc函数调用,后跟0x00001dec880
行的一个非常奇怪的数字,它每次编译时都不同。我不确定为什么会这样,并且将不胜感激
uint8_t* region_copy( const uint8_t array[], unsigned int cols, unsigned int rows,
unsigned int left, unsigned int top, unsigned int right, unsigned int bottom ) {
unsigned int corner1 = left + (top*cols);
unsigned int corner2 = right + (bottom*cols);
unsigned int newsize = (right - left) * (bottom - top);
if(left==right || top == bottom ) {
return NULL;
}
uint8_t* newimg = malloc(newsize * sizeof(uint8_t));
if(newimg == NULL){
return NULL;
}
memset(newimg, 0, newsize);
for(int i = corner1; i < corner2; i++) {
newimg[i] = array[i];
}
return newimg;
}
答案 0 :(得分:1)
这个循环错了:
for(int i = corner1; i < corner2; i++) {
newimg[i] = array[i]; }
源和目标的索引需要不同,因为它们的尺寸不同。你可以这样做:
for (int r = top; r < bottom; r++) // for each source row
{
for (int c = left; c < right; c++) // for each source col
{
int src_index = r * cols + c; // calc source index in array[]
int dst_index = (r - top) * (right - left) + (c - left);
// calc dest index in newimg[]
newimg[dst_index] = array[src_index]; // copy src -> dest
}
}
答案 1 :(得分:1)
此
for(int i = corner1; i < corner2; i++) {
newimg[i] = array[i]; }
从 array[i]
复制,这是您想要的,但它也会将复制到 newimg
的相同位置;好像newimg
与array
一样大。您需要从第0个索引开始复制到newimg
:
for(int i = corner1; i < corner2; i++) {
newimg[i-corner1] = array[i]; }
或更明确的操作
for(int i = 0; i< corner2 - corner1; i++) {
newimg[i] = array[corner1 + i]; }
它“更清晰”,因为从corner2 - corner1
开始,您可以复制corner1
元素。
但这不是唯一的错误!我只会在这里概述一下,因为它需要认真重写。
您复制“rows * columns”连续,即从左上角开始并继续到右下角:
..........
..********
**********
******....
..........
但您必须单独复制每列(或行):
..........
..****....
..****....
..****....
..........