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

问题描述 投票:0回答:4

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

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

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

c file bitmap structure bitmapimage
4个回答
0
投票

libbmp 将使您的程序实现起来几乎微不足道。


0
投票

如果您确实想使用 C 语言,请尝试 libbmp 库 http://code.google.com/p/libbmp/

但是,我建议使用 C#,那么使用 System.Drawing 命名空间,任务就会变得微不足道。


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;

}


0
投票

对于 C++,EasyBMP 位于 SourceForge 上:

https://easybmp.sourceforge.net/

SourceForge 上的覆盖范围已扩大到包括 AVI 作为 EasyBMPtoAVI:

https://easybmptoavi.sourceforge.net/

EasyBMP 的 GitHub 分支具有越来越高的 C++ 本地化水平:

https://github.com/aburgh/EasyBMP

我可能会在 GitHub 上克隆 SourceForge 源代码的整个历史(因为我已经在本地暂存了克隆)。如果是这样,那么它将在稍后的编辑和/或评论中列出。

libbmp 库

https://code.google.com/archive/p/libbmp/

遵循 GPL3 is EasyBMP - 仅用 C 语言重写并经过库化...并且也未经确认就发布到 EasyBMP,它遵循 BSD 许可证,而不是 GPL。另外,libbmp 没有 EasyBMP 中的“扩展”或“项目”源文件,也没有 EasyBMPtoAVI 中的任何内容。 EasyBMP 中的“项目”文件遵循 GPL2。

EasyBMP 是嵌入式代码,而不是库,基本上只有两个文件:*.cpp 源代码和 *.h 标头。实际上有几个标头,但它们都来自主 *.h 标头,并且可以轻松地内联替换到其中,因为它们都很小;所以你实际上只是在谈论两个文件。我认为布局、分割标题的原因是,最初,所有内容都在 *.h 文件中,直到版本 1.01。在 0.55 版本的一轮整合之前,实际上有 12-14 个 *.h 文件。 EasyBMP 的最新版本是 2006 年 12 月发布的 1.06,因此在 1.01 版本转换后并没有太多进一步的演变。

© www.soinside.com 2019 - 2024. All rights reserved.