1

我想实现一个简单的基于命令行的图像编辑器。该程序将提供一个基于文本的菜单,它为用户提供了几个操作 Windows 位图 (.bmp) 图像文件的功能。该菜单将包括加载图像、旋转图像、镜像、保存图像和退出选项。加载图像选项将用于打开和读取给定位图文件中的像素值。此选项还将打印给定文件的基本属性,例如尺寸和总大小。旋转和镜像选项将处理先前读取的像素值。在应用这些选项之前,必须加载图像。保存选项会将内存中的像素值保存到具有给定文件名的位图文件中。

关于这个项目和位图文件结构,您向我推荐哪种方法?

如果您就某个特定主题(例如加载文件)给我建议,我们将不胜感激。

4

3 回答 3

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 回答
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 回答