从其他程序中取得了位图资源(不是bmp文件,而是比如说一个exe文件里包含了位图资源),并取得了BITMAPINFOHEADER,现在想直接通过BITMAPINFOHEADER把那个位图显示在对话框的一个矩形区域里,看了MSDN说使用CreateDIBitmap()然后再StretchBlt(),但现在不会设置CreateDIBitmap函数里的第2、4、5个参数,请高手指点一下.HBITMAP CreateDIBitmap(
  HDC hdc,                        // handle to DC
  CONST BITMAPINFOHEADER *lpbmih, // bitmap data
  DWORD fdwInit,                  // initialization option
  CONST VOID *lpbInit,            // initialization data
  CONST BITMAPINFO *lpbmi,        // color-format data
  UINT fuUsage                    // color-data usage
)

解决方案 »

  1.   

    怎么不看一下MSDN中的函数说明?
      

  2.   

    现在是可以显示了,但是如果stretch的话图象会失真,而且在对话框响应WM_PAINT消息时原来画的会被擦除,怎么办?
      

  3.   

    试试把位图数据保存为BMP文件再显示,是不是会简单一些?
      

  4.   

    得到了LPBITMAPINFOHEADER,下面是保存位图的代码,在测试中发现有时保存的位图不能显示,尤其是当位图文件只有xx字节时,不知道是不是因为没有计算调色板导致,各位看下下面保存bmp的代码:
    BOOL CreateBMPFile(LPBITMAPINFOHEADER pbih,CString pszFile)
    {HANDLE hf;                  /* file handle */ 
    BITMAPFILEHEADER hdr;       /* bitmap file-header */
    LPBYTE lpBits;              /* memory pointer */ 
    DWORD dwTotal;              /* total count of bytes */ 
    DWORD cb;                   /* incremental count of bytes */ 
    BYTE *hp;                   /* byte pointer */ 
    DWORD dwTmp; 
    DWORD MAXWRITE = 65535; 
    int iNumColors;
    if (pbih->biBitCount <= 8)
    iNumColors = (1 << pbih->biBitCount);
    else
    iNumColors = 0;

    lpBits = (LPBYTE)pbih +  pbih->biSize + (iNumColors * sizeof(RGBQUAD));
    /* Create the .BMP file. */ 

    hf = CreateFile(pszFile, 
    GENERIC_READ | GENERIC_WRITE, 
    (DWORD) 0, 
    (LPSECURITY_ATTRIBUTES) NULL, 
    CREATE_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, 
    (HANDLE) NULL); 

    if (hf == INVALID_HANDLE_VALUE)
    {
    AfxMessageBox("Error Creating File"); 
    return FALSE;

    }

    hdr.bfType = 0x4d42;        /* 0x42 = "B" 0x4d = "M" */ 

    /* Compute the size of the entire file. */  hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + iNumColors * sizeof(RGBQUAD) + pbih->biSizeImage);

    hdr.bfReserved1 = 0; 
    hdr.bfReserved2 = 0; 

    /* Compute the offset to the array of color indices. */ 
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + iNumColors* sizeof (RGBQUAD); 


    /* Copy the BITMAPFILEHEADER into the .BMP file. */ 

    if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), 
    (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)) 
    {
    MessageBox("写入文件时出错!",NULL,MB_ICONERROR|MB_OK); 
    return FALSE;

    }

    /* Copy the BITMAPINFOHEADER and RGBQUAD array into the file. */ 

    if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) 
    + iNumColors * sizeof (RGBQUAD), 
    (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)) 

    {
    MessageBox("写入文件时出错!",NULL,MB_ICONERROR|MB_OK); 
    return FALSE;

    }


    /* Copy the array of color indices into the .BMP file. */ 

    dwTotal = cb = pbih->biSizeImage; 
    hp = lpBits; 
    while (cb > MAXWRITE)  { 
    if (!WriteFile(hf, (LPSTR) hp, (int) MAXWRITE, 
    (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)) 
    {
    MessageBox("写入文件时出错!",NULL,MB_ICONERROR|MB_OK); 
    return FALSE;


    }
    cb-= MAXWRITE; 
    hp += MAXWRITE; 

    if (!WriteFile(hf, (LPSTR) hp, (int) cb, 
    (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)) 
    {
    MessageBox("写入文件时出错!",NULL,MB_ICONERROR|MB_OK); 
    return FALSE;

    }

    /* Close the .BMP file. */ 

    if (!CloseHandle(hf)) 
    {

    MessageBox("关闭文件时出错!",NULL,MB_ICONERROR|MB_OK); 
    return FALSE;
    }
        

    UnlockResource(bmpgl);
    FreeResource(bmpgl);
    return TRUE;
    }
      

  5.   

    刚才换reshacker保存了一下那些用我的函数不能正确保存的位图,发现那些不能正确保存的位图文件的尺寸不对,不知道计算尺寸那里错在哪里?
      

  6.   

    http://asp.6to23.com/iseesoft/devdoc/imgdoc/bmp_fileformat.htm这篇文章看一下吧,而且那个站点就是一个开源的图像处理软件,应该有很多东西值得借鉴 :)
      

  7.   

    发现下面这条信息:
    biBitCount=24 表示位图最多有2^24种颜色。这种位图没有调色板(bmiColors成员尺寸为0),在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。
    那么调色板的尺寸该如何计算,在写入文件时的偏移又该如何重新计算?
      

  8.   

    当biBitCount为24,32时,是没有调色板的,此时调色板的尺寸为0.
      

  9.   

    偏移如何计算?  其他位数的调色板尺寸怎么算?
    看了半天bmp文件结构的文章了,还是搞不明白....
      

  10.   

    这些还是有点麻烦的,楼主的终极目的是什么,显示还是存储?偶最近写过一些,stech是肯定要失真的.
      

  11.   

    最好用的是CDib类,可以google一下,有源码的.找不到的话和我联系,留mail: [email protected]
      

  12.   

    当biBitCount=1,4,8的时候,需要有调色板,调色板的大小为(2^biBitCount)*4个字节.
      

  13.   

    To:missle(闪人)
    本来是想在得到BITMAPINFOHEADER后直接创建DIB,然后用DC画在对话框上但后来发现画的东西在对话框响应WM_PAINT消息时会被擦除掉,所以决定多走一步,先保存成位图,然后再显示.