1

簡単なコマンドラインベースの画像エディタを実装したいと思います。プログラムは、ユーザーがWindowsビットマップ(.bmp)画像ファイルを操作するためのいくつかの機能を提供するテキストベースのメニューを提供します。メニューには、画像の読み込み、画像の回転、画像のミラーリング、画像の保存、終了オプションが含まれます。画像の読み込みオプションは、特定のビットマップファイルからピクセル値を開いて読み取るために使用されます。このオプションは、指定されたファイルのサイズや合計サイズなどの基本的なプロパティも出力します。回転とミラーリングのオプションは、以前に読み取ったピクセル値を操作します。これらのオプションを適用する前に、画像をロードする必要があります。保存オプションは、メモリ内のピクセル値を指定されたファイル名のビットマップファイルに保存します。

このプロジェクトとビットマップファイル構造について、どのアプローチをお勧めしますか?

ファイルの読み込みなど、特定のトピックについてもアドバイスをいただければ幸いです。

4

3 に答える 3

0

本当にCを使用したい場合は、libbmpライブラリhttp://code.google.com/p/libbmp/を試してください。

ただし、C#を使用することをお勧めします。そうすれば、System.Drawing名前空間を使用したタスクは簡単になります。

于 2012-12-26T20:20:59.720 に答える
0

libbmpを使用すると、プログラムの実装は簡単になります。

于 2012-12-26T20:21:17.663 に答える
0

この関数は、bmpファイルをメモリにロードするために使用されます。最初にbmp構造のヘッダーファイルを宣言する必要があります

BMP* load_BMP(char *filename);

BMP *bmp;       // local integer for file loaded
FILE *in;       // pointer for file opening
int rowsize;   

int row, col, color, i;
unsigned char b;

in=fopen(filename,"rb"); // open binary file
if (in==NULL)
{
    printf("Problem in opening file %s.\n",filename);
    return NULL;
}


bmp=(BMP*) malloc(sizeof(BMP)); //memory allocation
if (bmp==NULL)
{
    printf("Not enough memory to load the image.\n");
    return NULL;
}

fread(bmp->BM,2,1,in);
if (bmp->BM[0]!='B' || bmp->BM[1]!='M')
{
    printf("Bad BMP image file.\n");
    free(bmp);
    return NULL;
}

fread(&bmp->fileSize,4,1,in);
fread(&bmp->Reserved1,2,1,in);
fread(&bmp->Reserved2,2,1,in);
fread(&bmp->imageOffset,4,1,in);
fread(&bmp->imageHeaderSize,4,1,in);
fread(&bmp->imageWidth,4,1,in);

rowsize=4*((3*bmp->imageWidth+3)/4); //calculate rowsize because of padding

fread(&bmp->imageHeight,4,1,in);
fread(&bmp->colorPlanes,2,1,in);
fread(&bmp->compressionMethod,4,1,in);
fread(&bmp->imageSize,4,1,in);
fread(&bmp->hPPM,4,1,in);
fread(&bmp->vPPM,4,1,in);
fread(&bmp->paletteColors,4,1,in);
fread(&bmp->paletteImportantColors,4,1,in);


bmp->data=(unsigned char*) malloc(bmp->imageSize); //allocate memory for image data array
if (bmp->data==NULL)
{
    printf("There is not enough memory to load the image\n");
    free(bmp);
    return NULL;
}

for(row=0;row<bmp->imageHeight;row++)  //read picture data
{
    for(col=0;col<bmp->imageWidth;col++)
        for(color=0;color<=2;color++)
            fread(&bmp->data[row*rowsize+3*col+color],
            sizeof(unsigned char),1,in);

    //read extra bytes for end of row padding
    for(i=0;i<rowsize-3*bmp->imageWidth;i++)
        fread(&b,1,1,in);
}

fclose(in);
return bmp;

}

于 2013-12-08T21:40:22.593 に答える