回 帖 发 新 帖 刷新版面

主题:目前可以找到的最完整,最精细的bmp格式解析

写了一个位图的操作类,找了不少的bmp文件结构解析。发现没有一个完全正确的、完整的。在完成这个位图操作类后整理了这一篇位图文件解析。
可以说这是在中国能找的的,最好的bmp文件格式解析。

以前的文章里边给出的代码,是从我的位图操作类中截取的,复制过来不能直接用。

现在我又从新写了几个结构化的位图操作接口,并给出了一个例子。都添加到这个附件中了。新上传的文章里的函数也用新写的函数替换了,并且原来的文章中使用了几个常量没有说明。现在也添加进去了。

例子程序:

#include <cstdio>
#include <cstdlib>
#include "CBmp.h"

int main( int argc, char** argv )
{
    CBmp tmpBmp;

    if (argc!=3)
        printf("usage filename1 filename2\n");
    else
    {
        if (openBmp(tmpBmp,argv[1]))
        {
            DWORD imW=getWidth(tmpBmp);
            DWORD imH=getHeight(tmpBmp);
            BYTE * Im=new BYTE[imW*imH];
            tranToArray(tmpBmp,Im);
            createGrayBmp(tmpBmp,Im,imW,imH);
            saveBmp(tmpBmp,argv[2]);
            delete [] Im;
            releaseBmp(tmpBmp);
        }
        else
            printf("can not open %s!\n",argv[1]);
    }
    return 0;
}
第二次修改,文章中的两处错误。代码中的两处错误,实现也有稍微修改。

回复列表 (共22个回复)

21 楼

看帖回帖^_^

22 楼

LZ,你这里有问题的~~位图格式不止BITMAPINFOHEADER一种~~
还有你调色板里的:
        if (0<inBmp.bmpInfoH.biBitCount&&inBmp.bmpInfoH.biBitCount<=8)
            colorCount=(WORD)(pow(2,inBmp.bmpInfoH.biBitCount));
        else
            colorCount=0;
是不严谨的~~还要考虑biClrUsed字段的~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册