2017-10-21 122 views
-1

我正在使用更改位图图像的程序。我想要做的只是将图像翻转180度,但无论我做什么,我要么摧毁标题,要么导致分段错误,要么模糊混乱。像素保持像素数据,每个数组元素是像素的单独颜色。这里是我的翻转图像代码:翻转c中的图像

通过逆转每一行(当时的规划扭转每一列)

for(r = 0; r < 1; r++) { 
    j = ((WIDTH * 3) - 3); 
    i = 0; 
    while(i < j) { 
     memmove(temp, &pixels[r][i], 3); 
     memmove(&pixels[r][i], &pixels[r][j], 3); 
     memmove(&pixels[r][j], temp, 3); 
     i += 3; 
     j -= 3; 
    } 
} 

通过旋转180度

unsigned char pixels2[HEIGHT][WIDTH * 3]; 
for(r = 0; r < HEIGHT; r++) { 
    for(c = 0; c < (WIDTH * 3) - 3; c += 3) { 
     memmove(&pixels2[HEIGHT - r][(WIDTH * 3) - c], &pixels[r][c], 1); 
    } 
} 

我知道我破坏记忆莫名其妙,但对于我的生活我无法弄清楚如何。任何帮助,将不胜感激。

+0

你操纵什么图像格式? R,G和B的这个RGB是三位字节还是RGB独立平面?它可能是16位格式的RGBA或RGB? – tadman

+0

考虑使用一些库,也许[OpenCV](http://opencv.org/);并使用调试器 –

+0

它是BGR。每个像素颜色都存储为一个无符号字符 –

回答

1
memmove(&pixels2[HEIGHT - r][(WIDTH * 3) - c], &pixels[r][c], 1); 

夫妇的问题在这里:1)当c=0r=0要复制您的数组边界之外,2)你需要在一次复制3个字节,而不是1 3)您也大概可以使用memcpy代替memmove。

例如,你的底码,改变循环到:

for(c = 0; c < (WIDTH * 3); c += 3) { 
    memmove(&pixels2[(HEIGHT-1)-r][(WIDTH-1)*3 - c], &pixels[r][c], 3); 

在一般情况下,你要到j改变GBR像素在我,以高度的i-1,WIDTH-J-1。假设你的格式是正确的,我会尝试一些简单的开始。像:

for (i=0; i < HEIGHT; ++i) 
{ 
    for(j=0; j < WIDTH; ++j) 
    { 
     memcpy(&pixels2[HEIGHT-i-1][3*(WIDTH-j-1)], &pixels[i][3*j], 3); 
    } 
}