在C中翻转PPM图像

时间:2015-04-06 16:36:25

标签: c

我早些时候找到了一个只是一个简单错误的问题,所以我希望眼睛看着这个也是一样的。

这是在C

我必须水平翻转PPM图像,但我当前的代码要么绘制分段错误,要么实际上没有翻转任何内容。

我用来绘制分段错误的代码是:

int a, b, x, y;
x = 3 * myPic->rows;
y = 3 * myPic->cols;
for(a = 0; a < (y / 2); a++) {
    for(b = 0; b < x; b++) {
        Pixel temp = myPic->pixels[a][b];
        myPic->pixels[a][b] = myPic->pixels[y - a - 1][b];
        myPic->pixels[y - a - 1][b] = temp;
    }
}
return myPic;

}

不返回任何更改的代码是:

int a, b, x, y;
for(a = 0; a < myPic->rows; a++) {
    for(b = 0; b < myPic->cols; b++) {
        Pixel temp = myPic->pixels[a][b];
        myPic->pixels[a][b] = myPic->pixels[myPic->cols - a - 1][b];
        myPic->pixels[myPic->cols - a - 1][b] = temp;
    }
}
return myPic;

因为PPM图像具有RGB值,所以我假设行和列值应该乘以3。而且我认为一路走来会让它回到原来的位置,所以我将宽度(列)除以2。我被困了,我希望这是一个小错误,任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你的第一个代码很糟糕,它从它的边界访问数组。你的第二个代码更好,虽然它翻转图像然后它重新折叠回来。

而直接出来的事情,行数是图片高度,列数是图片宽度,2-d数组中的第一个索引是行选择(高度索引),第二个索引是列选择(宽度)指数)。水平翻转从左到右交换像素。 垂直翻转从上到下交换像素。

有了这个,这应该是一个水平翻转

int row, col;
for(row = 0; row < myPic->rows; row++) {
    for(col = 0; col < myPic->cols / 2 ; col++) { /*notice the division with 2*/
        Pixel temp = myPic->pixels[row][col];
        myPic->pixels[row][col] = myPic->pixels[row][myPic->cols - col -1];
        myPic->pixels[row][myPic->cols - col -1] = temp;
    }
}
return myPic;

在内存中修改图像后,您需要保存它,或者使用您正在使用的图形库重新绘制已修改的图像。