1

プログラミングは初めてなので、これには簡単な解決策があるかもしれません。これが私がやろうとしていることです。

私のプログラムは .bmp 画像をロードし、幅と高さを取得して画像のピクセル数を調べます。次に、calloc() を使用して、各ピクセルの RGB 値の 3 つの配列を作成します。RED、BLUE、GREEN の配列があります。while() ループを使用して最初のピクセルを取得し、RGB 値をそれぞれの配列の最初の要素に配置しました。次に、2番目のピクセル、3番目、4番目のピクセルについても同じことを行います...これが私の問題です。配列に値を入れたくないようです。こうやって、

while(temp=fgetc(fp) != NULL)
{
BLUE[current_pixel]=temp;

temp=fgetc(fp);
GREEN[current_pixel]=temp;

temp=fgetc(fp);
RED[current_pixel]=temp;

current_pixel++;
}

current_pixel は、現在どのピクセルを見ているかを追跡する変数です。

だから、私が本当に知りたいのは、なぜ BLUE[current_pixel]=temp; を実行できないのかということだと思います。コンパイル時にエラーは発生せず、printf() ステートメントを使用して問題の場所を確認しました。

BLUE[1]=temp を試してみましたが、問題なく動作しますが、値を保存するために次のピクセルに移動できないため、プログラムには適していません。

助けてくれてありがとう!

編集:私はまだそれを機能させることができないので、プログラム全体をここに投稿するだけです。

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE*fp;
int current_pixel=0;
int temp=0;
int paddingremoved=0;
int cycle=0;
int *RED;
int *BLUE;
int *GREEN;
int imgstrt=0;
int width=0;
int height=0;
int padding=0;

fp=fopen("C:\\Users\\Jason\\Documents\\test.bmp","rb");

if(fp==NULL)
{
printf("Error: File could not be opened");
getchar();
return(0);
}


fseek(fp,10,SEEK_SET);
fread(&imgstrt,1,1,fp);
printf("Image Starts At:%d\n",imgstrt);

fseek(fp,18,SEEK_SET);
fread(&width,4,1,fp);
printf("Image Width:%d\n",width);

fseek(fp,22,SEEK_SET);
fread(&height,4,1,fp);  
printf("Image Height:%d\n",height);

padding=(4 -(width*3)%4)%4;
printf("Padding:%d\n",padding);
getchar();

RED = (int*)calloc(height*width+1,sizeof(int));
GREEN = (int*)calloc(height*width+1,sizeof(int));
BLUE = (int*)calloc(height*width+1,sizeof(int));

if(RED == NULL)
{printf("Red Allocation Faliure\n");}
else{printf("Red Allocation Successful\n");}

if(GREEN == NULL)
{printf(" Green Allocation Faliure\n");}
else{printf("Green Allocation Successful\n");}

if(BLUE == NULL)
{printf("Blue Allocation Faliure\n");}
else{printf("Blue Allocation Successful\n");}

fseek(fp,54,SEEK_SET);
/*---------------------Main Loop--------------------------------*/
while((temp = fgetc(fp)) != EOF)
{
    BLUE[current_pixel]=temp;
    temp=fgetc(fp);
    GREEN[current_pixel]=temp;
    temp=fgetc(fp);
    RED[current_pixel]=temp;
    cycle++;
    current_pixel++;

    printf("[%d,%d,%d::%d] ",RED[current_pixel],GREEN[current_pixel],BLUE[current_pixel],current_pixel);
/*------------------------------------------------------------------*/

    /*---------------------Padding Remover-----------------------*/
    if(cycle==width)
    {printf("\n");
    while (paddingremoved!=padding)
    {fgetc(fp); 
                paddingremoved++;}
    cycle=0;
    paddingremoved=0;}
    /*-----------------------------------------------------------*/
}

getchar();
free(RED);
free(BLUE);
free(GREEN);
return(0);
}
4

2 に答える 2

4

C 演算子の優先順位により、while条件は次のようになります。

temp=(fgetc(fp) != NULL)

そしてそうではない

(temp=fgetc(fp)) != NULL

括弧を使用します。また、ではなく、エラー/終了時にfgetc戻ります。EOFNULL

于 2012-12-09T00:54:27.793 に答える
1

演算子の優先順位により、コードは常にすべての BLUE ピクセルを 1 に設定します。while() ループ条件は、結果fgetc(fp)を NULLと比較し、その比較のtemp結果 (0 または 1) に設定します。したがって、すべての BLUE ピクセルが 1 に設定されます。

代わりにこれを試してください:

while((temp = fgetc(fp)) != EOF)
于 2012-12-09T00:56:34.440 に答える