2017-10-21 23 views
-1

私はビットマップイメージを変更するプログラムを扱っています。私がしたいのは、画像を180度反転させることですが、私が何をしていても、ヘッダーを破棄したり、セグメンテーション違反を起こしたり、ぼやけてしまいます。ピクセルはピクセルデータを保持し、各配列要素はピクセルの個々の色である。ここでは画像を反転のための私のコードは次のとおりです。イメージを反転する

(その後、各列を逆にする計画)の各行を逆にすることにより

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

あなたはどのような画像フォーマットを操作していますか?このRGBはR、G、Bの独立したプレーンのようにトリプレットバイトまたは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=0またはr=0あなたが配列の範囲外にコピーしている、2)あなたは1. 3、一度に3つのバイトをコピーする必要はありません)また、あなたはおそらく代わりにmemcpyをを使用することができますmemmoveの

例では、あなたの一番下のコードのためにループを変更します。

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

、あなたは私のGBRピクセルを変更したい、HEIGHT-I-1とJ、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); 
    } 
} 
関連する問題