本人做图像相关程序时先后在BMP文件的读写上遇到了如下麻烦:1.用LoadImage固然方便,可是要取得图像的Height和Width的时候(用GetBitmapDimensionEx)取出来的都是0。本来取长宽方向像素数目也是为了用GetBitmapBits取位图数据。2.经人指点,自己写函数读写BMP文件,目的是为了取出BITMAPINFOHEADER,结果现在不知该如何处理位图文件中BITMAPINFOHEADER后面的颜色表。BITMAPINFOHEADER后面到底是什么好像有很多种情况。哪位能够给个详细的说明呢?3.是不是取得了文件中的BITMAPINFOHEADER和位图数据后就可以用CreateDIBitmap创建一个位图而得到位图句柄了呢?4.自己写的类的头文件中包含<wingdi.h>的时候,编译报错,而且都是wingdi.h中的错误,主要是missing ';' before identifier ×××;最后一个是fatal error C1004: unexpected end of file found,不知为什么,谢谢指点。

解决方案 »

  1.   

    http://www.ynhack.com/Article/6/46/2005/200509151728.html
    不知道你读入BMP文件是作什么用,如果只是显示的话,不用这么复杂的
      

  2.   

    要读写建议用CxImage,到处有的下
    显示用LoadImage就可以了,你要用GetObject获得长宽
    BITMAP bm;
    GetObject(&bm,..)
      

  3.   

    在google上查询“ bmp 文件读写” 
    你可以找到非常多的答案的:http://www.vckbase.com/document/viewdoc/?id=674
    http://www.vczx.com/article/show_srccode.php?id=306
    ......
      

  4.   

    LoadImage只是权宜之计,还是自己写个类读取吧。
    现成的也有,你google一下CDib,一堆。
      

  5.   

    想他们说的那样,找个类研究2.BITMAPINFOHEADER后面可能是调色板,也可能是图像数据(24位时),得到调色板指针,然后读入.3.位图有多种方法显示,其中一种是
    创建与设备兼容内存,然后创建与设备兼容位图, 然后内存SELECT位图进去,方法有几种4,可能缺少},认真检查
      

  6.   

    推荐看一下<<VC++图像处理(第二版)>>,看了你就明了的!
      

  7.   

    1.用GetObject就可以
    BITMAP bm;
    GetObject(hBmp, sizeof(bm), &bm);
    SIZE bmSize;
    bmSize.cx = bm.bmWidth;
    bmSize.cy = bm.bmHeight;
    4.最好直接包含Windows.h
      

  8.   

    读文件方式可以。一般网上的代码也是如此。先整个读入文件,然后按结构读取各个部分,如果不是高彩模式的位图,BITMAPINFOHEADER后面还会有调色板,你需要创建调色板,之后才是位图数据。在拿到了位图头,调色板(if exists),位图数据之后就能创建位图了。
      

  9.   

    只是显示位图的话,这样就可以了UC   DrawImage(HDC Hdc, US x, US y, LPCSTR str)  //画位图
    {
    HBITMAP hBitmap;            //定义位图句柄
    BITMAPINFO * pbi;           //定位位图信息头
    pbi=(BITMAPINFO *)malloc(sizeof(BITMAPINFO));     //申请空间
    hBitmap=(HBITMAP)LoadImage(0,str,IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR|LR_LOADFROMFILE);   //装载位图
    pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);  //初始化
    pbi->bmiHeader.biBitCount=0;
    GetDIBits(Hdc,hBitmap,0,0,NULL,pbi,DIB_PAL_COLORS);   //获得位图信息头信息
    Hdcnew=CreateCompatibleDC(Hdc);     //定义与Hdc相兼容的内存设备
    SelectObject(Hdcnew,hBitmap);    //将位图转载到内存DC
    BitBlt(Hdc,x,y,pbi->bmiHeader.biWidth,pbi->bmiHeader.biHeight,Hdcnew,0,0,SRCCOPY);  //显示位图
    return true;
    }