从图像复制像素区域

时间:2014-10-07 21:24:42

标签: c

获取一张新图片,该图片是该地区的副本。空区域返回 空指针。如果内存分配失败,则返回null 指针。调用者负责释放返回的数组。

该区域包含[left, right-1]包含的所有列, 以及[top, bottom-1]包含的所有行。

在每种情况下,您都可以认为left <= righttop <= bottom: 不需要为此进行测试。

该地区的面积为(right-left) * (bottom-top)像素 暗示如果left == righttop == 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;
}

2 个答案:

答案 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的相同位置;好像newimgarray一样大。您需要从第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”连续,即从左上角开始并继续到右下角:

..........
..********
**********
******....
..........

但您必须单独复制每列(或行):

..........
..****....
..****....
..****....
..........