在c语言中使用位图文件结构操作位图图像文件



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

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

如果你给我建议,即使是关于一个特定的主题,例如加载文件,我将非常感激。

libbmp将使您的程序实现起来非常简单。

如果你真的想使用C,那么试试libbmp库http://code.google.com/p/libbmp/

然而,我建议使用c#,那么这个任务对于系统来说就微不足道了。图纸名称空间。

此函数用于将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 imagen");
    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;

}

相关内容

  • 没有找到相关文章

最新更新