void CTestDlg::ShowBMP(CPaintDC* pDC)
{
char hzcell[500][500];    HBITMAP hBitmap = NULL;
    LPSTR lpBits; BITMAPFILEHEADER Bfh;
    LPBITMAPINFO lpBmi;
    FILE *fp;
    int BmiSize,PixSize;
 
    fp = fopen("test.bmp","rb");   //  test.bmp 是一个单色位图  大小是 223*163
    fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp);  // 读位图文件头
    BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER);  // 计算位图信息大小
    lpBmi = (LPBITMAPINFO) malloc(BmiSize);  // 申请位图信息存储空间
    fread(lpBmi,BmiSize,1,fp);  // 读入位图信息
 
    hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0);  // 建立DIBSection
    int wid = lpBmi->bmiHeader.biWidth;  // 保存图像参数  图像宽
    int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数  图像高
    int bits = lpBmi->bmiHeader.biBitCount;  //  图像每像素所占位数
    PixSize = (wid*bits+31)/32*4*hei;  // 计算像素数据大小
    free(lpBmi);  // 释放位图信息    fseek(fp,Bfh.bfOffBits,SEEK_SET);
    fread(lpBits,PixSize,1,fp);  // 读取像素数据 for(int r=0;r<120;r++)
for(int c=0;c<120;c++)
hzcell[r][c]=0; int rowchars=(wid*bits+31)/32*4;
for(r=0;r<hei;r++)
{
for(int c=0;c<rowchars;c++)
{
int num=lpBits[r*rowchars+c];
int at=0;
while(num>0)
{
if(8*c+7-at<wid)
hzcell[r][8*c+7-at]=num%2;
num=num/2;
at++;
}
}
}
    fclose(fp);


for(r=0;r<hei;r++)
for(int c=0;c<wid;c++)
if(hzcell[r][c]==1)
pDC->SetPixel(100+c,100+r,RGB(0,0,0));}

解决方案 »

  1.   

    提几点看法:
    一是函数参数类型最好用CDC*而不是CPaintDC*;
    二是文件最好一次读入然后用指针指向不同位置来解析。
    三是既然逐点描绘,就不用创建位图了。
    然后对你后面的处理看不明白,单色位图的话直接按照每个点绘制到界面上去就行了,一个字节8个点,用位运算取值。
      

  2.   

    我是把图像信息存放在矩阵
      char hzcell[500][500]; 中然后,对有数据的位置画点
      

  3.   

    为了让大家更好的理解,我把我的思路写出来,把 单色BMP 文件像素信息 存保在矩阵  bool hzcell[500][500];  中
        黑色位置为 true 白色位置为 false
    然后 根据 hzcell 信息 直接画像素
        for(r=0;r <hei;r++) 
           for(int c=0;c <wid;c++) 
              if(hzcell[r][c]) 
                 pDC->SetPixel(100+c,100+r,RGB(0,0,0)); 以下为 该功能的 改进函数:void CTestDlg::ShowBMP(CPaintDC* pDC) 

        bool hzcell[500][500]; //  用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false    HBITMAP hBitmap = NULL; 
        LPSTR lpBits;     BITMAPFILEHEADER Bfh; 
        LPBITMAPINFO lpBmi; 
        FILE *fp; 
        int BmiSize,PixSize; 
      
        fp = fopen("test.bmp","rb");   //  test.bmp 是一个单色位图  大小是 223*163 
        fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp);  // 读位图文件头 
        BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER);  // 计算位图信息大小 
        lpBmi = (LPBITMAPINFO) malloc(BmiSize);  // 申请位图信息存储空间 
        fread(lpBmi,BmiSize,1,fp);  // 读入位图信息 
      
        hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0);  // 建立DIBSection 
        int wid = lpBmi->bmiHeader.biWidth;  // 保存图像参数  图像宽 
        int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数  图像高 
        int bits = lpBmi->bmiHeader.biBitCount;  //  图像每像素所占位数 
        PixSize = (wid*bits+31)/32*4*hei;  // 计算像素数据大小 
        free(lpBmi);  // 释放位图信息     fseek(fp,Bfh.bfOffBits,SEEK_SET); 
        fread(lpBits,PixSize,1,fp);  // 读取像素数据 ,存放在 lpBits 指向的内存中    for(int r=0;r <120;r++) 
           for(int c=0;c <120;c++) 
              hzcell[r][c]=0;   //   初始化 像素信息矩阵     int rowchars=(wid*bits+31)/32*4;   //   每行像素所需的字节数
        for(r=0;r <hei;r++) 
        { 
           for(int c=0;c <rowchars;c++) 
           { 
               char num=lpBits[r*rowchars+c]; 
               for(int at=0;at<8;at++)
               {
                   hzcell[r][8*c+7-at]=num&1;
                   num>>1; 
               } 
            } 
        } 
        fclose(fp); 
        //   显示 位图信息
        for(r=0;r <hei;r++) 
           for(int c=0;c <wid;c++) 
              if(hzcell[r][c]) 
                 pDC->SetPixel(100+c,100+r,RGB(0,0,0)); } 
      

  4.   

    CPaintDC改为CDC,调用时:
    CDC *pdc=GetDC();
    ShowBMP(pdc);函数修改如下:
    void CStrapdownPlatformDlg::ShowBMP(CDC* pDC)  
    {  
        bool hzcell[500][500]; //  用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false     HBITMAP hBitmap = NULL;  
        LPSTR lpBits;      BITMAPFILEHEADER Bfh;  
        LPBITMAPINFO lpBmi;  
        FILE *fp;  
        int BmiSize,PixSize;  
       
        fp = fopen("test.bmp","rb");   //  test.bmp 是一个单色位图  大小是 223*163  
        fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp);  // 读位图文件头  
        BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER);  // 计算位图信息大小  
        lpBmi = (LPBITMAPINFO) malloc(BmiSize);  // 申请位图信息存储空间  
        fread(lpBmi,BmiSize,1,fp);  // 读入位图信息  
       
        hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0);  // 建立DIBSection  
        int wid = lpBmi->bmiHeader.biWidth;  // 保存图像参数  图像宽  
        int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数  图像高  
        int bits = lpBmi->bmiHeader.biBitCount;  //  图像每像素所占位数  
        PixSize = (wid*bits+31)/32*4*hei;  // 计算像素数据大小  
        free(lpBmi);  // 释放位图信息      fseek(fp,Bfh.bfOffBits,SEEK_SET);  
        fread(lpBits,PixSize,1,fp);  // 读取像素数据 ,存放在 lpBits 指向的内存中     for(int r=0;r  <120;r++)  
           for(int c=0;c  <120;c++)  
              hzcell[r][c]=0;   //   初始化 像素信息矩阵      int rowchars=(wid*bits+31)/32*4;   //   每行像素所需的字节数 
        for(r=0;r  <hei;r++)  
        {  
           for(int c=0;c  <rowchars;c++)  
           {  
               char num=lpBits[r*rowchars+c];  
               for(int at=0;at <8;at++) 
               { 
                   hzcell[r][8*c+7-at]=num&1; 
                   num=num>>1; //修改 
               }  
            }  
        }  
        fclose(fp);  
        //   显示 位图信息 
        for(r=0;r  <hei;r++)  
           for(int c=0;c  <wid;c++)  
              if(hzcell[r][c])  
                 pDC->SetPixel(100+c,200-r,RGB(255,255,255));//修改,要不上下颠倒  
      else
    pDC->SetPixel(100+c,200-r,RGB(0,0,0));  } 
      

  5.   

    CPaintDC改为CDC,调用时:
    CDC *pdc=GetDC();
    ShowBMP(pdc);函数修改如下:
    void CStrapdownPlatformDlg::ShowBMP(CDC* pDC)  
    {  
        bool hzcell[500][500]; //  用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false     HBITMAP hBitmap = NULL;  
        LPSTR lpBits;      BITMAPFILEHEADER Bfh;  
        LPBITMAPINFO lpBmi;  
        FILE *fp;  
        int BmiSize,PixSize;  
       
        fp = fopen("test.bmp","rb");   //  test.bmp 是一个单色位图  大小是 223*163  
        fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp);  // 读位图文件头  
        BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER);  // 计算位图信息大小  
        lpBmi = (LPBITMAPINFO) malloc(BmiSize);  // 申请位图信息存储空间  
        fread(lpBmi,BmiSize,1,fp);  // 读入位图信息  
       
        hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0);  // 建立DIBSection  
        int wid = lpBmi->bmiHeader.biWidth;  // 保存图像参数  图像宽  
        int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数  图像高  
        int bits = lpBmi->bmiHeader.biBitCount;  //  图像每像素所占位数  
        PixSize = (wid*bits+31)/32*4*hei;  // 计算像素数据大小  
        free(lpBmi);  // 释放位图信息      fseek(fp,Bfh.bfOffBits,SEEK_SET);  
        fread(lpBits,PixSize,1,fp);  // 读取像素数据 ,存放在 lpBits 指向的内存中     for(int r=0;r  <120;r++)  
           for(int c=0;c  <120;c++)  
              hzcell[r][c]=0;   //   初始化 像素信息矩阵      int rowchars=(wid*bits+31)/32*4;   //   每行像素所需的字节数 
        for(r=0;r  <hei;r++)  
        {  
           for(int c=0;c  <rowchars;c++)  
           {  
               char num=lpBits[r*rowchars+c];  
               for(int at=0;at <8;at++) 
               { 
                   hzcell[r][8*c+7-at]=num&1; 
                   num=num>>1; //修改 
               }  
            }  
        }  
        fclose(fp);  
        //   显示 位图信息 
        for(r=0;r  <hei;r++)  
           for(int c=0;c  <wid;c++)  
              if(hzcell[r][c])  
                 pDC->SetPixel(100+c,200-r,RGB(255,255,255));//修改,要不上下颠倒  
      else
    pDC->SetPixel(100+c,200-r,RGB(0,0,0));  }