1

私は画像を白黒にしてからCで90度回転させようとしましたが、プログラミングにはかなり慣れていません。

#include<stdio.h>
#include<string.h>

int main () {
FILE* first;
FILE* second;
FILE* third;
int counter;
char c;
int width, height, pixelmax, average;
int pixelred, pixelgreen, pixelblue, black[300][300][3];
int i, j, timer=0;
int k, f=0;
first=fopen("blackbuck.ppm","r");
second=fopen("blacktrout.ppm","w");

これにより、コードの最初の数行がスキップされます

for(counter=1;counter<3;counter++){
do{
    c=getc(first);
}while(c != '\n');
    }
fscanf(first,"%d%d", &width,&height);
fscanf(first,"%d", &pixelmax);

プログラムのこの部分では、ピクセルを平均して白黒に変換します。これは簡単な部分です。

for(i=0, j=0; i<width;i++, timer++){
fscanf(first,"%d%d%d",&pixelred,&pixelgreen,&pixelblue);
average=(pixelred+pixelgreen+pixelblue)/3;
black[i][j][0]=average;
black[i][j][1]=average;
black[i][j][2]=average;
fprintf(second,"%d %d %d\n",black[i][j][0],black[i][j][1],black[i][j][2]);

if (i==(width-1)&& j<height){
i=0;
j++;
}
}
fclose(first);
fclose(second);
third=fopen("blackflip.ppm","w");

これは私が完全に失われた部分です.3D配列のピクセルストアを90度回転させる方法がわかりません. 何か助けてください。よく説明された説明は、私のような初心者プログラマーにとって大いに役立ちます。ありがとう!

for(...???)
}
}


return 0;
4

3 に答える 3

1

基本的なロジックは次のとおりです。

original_x = original_height-1-rotated_y
original_y = rotated_x
rotated_image(rotated_x,rotated_y) = original_image(original_x,original_y)

(0,0) が左上隅で、左に 90 度回転させたいとしましょう。次に、回転した画像の左上隅は、(original_height-1,0) にある元の画像の右上隅に相当します。

画像の上部を横切ると、x が増加し、右側に沿って元の画像からピクセルを取得し、y が増加するため、回転した画像の x は元の画像の y のようになります。

y を増やしながら、rotated_image を下に移動すると、original_image の左側に移動します。これが、original_height-1 からrotated_y を差し引いて original_x 座標を取得する理由です。

もう 1 つの注意点は、回転した画像の幅と高さが元の画像と逆になっていることです。

于 2012-11-20T15:19:38.250 に答える
0
for (i = width-1 ; i >= 0 ; --i){
    for(j = height-1 ; j >= 0 ; --j)
        // use formulas: x' = y; y' = -x' to rotate left
        rotated[i][j] = black[j][width-i-1];
}
于 2012-11-20T15:30:58.527 に答える
0

一般に、次の式を使用して点を時計回りに alpha 度回転させることができます。

次に x_rotated = x*cos(alpha) - y*sin(alpha); y_rotated = x*sin(アルファ) + y*cos(アルファ);

alpha が時計回りに 90 度の場合

x_rotated = -y; y_回転 = x;

これがお役に立てば幸いです

于 2012-11-20T15:40:15.450 に答える