我写了下面一段代码,功能很简单,就是创建一幅8位的bmp位图,像素点灰度值都置为0。但是创建的文件打开时显示“没有预览”。我把代码贴上,大家帮忙看看。其中WIDTHBYTES(i)=((i+31)/32*4),用来把bmp图像数据的每行的字节数凑成4的整数倍。
         
         int nLineBytes = WIDTHBYTES(1280*8); //8 depths 
int nDibSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ sizeof(RGBQUAD)*256/*8 depths*/
+ nLineBytes * 1024; HANDLE hDib;
hDib = ::GlobalAlloc(GHND, nDibSize);
if(hDib == NULL) return NULL;

LPBYTE pDib = (LPBYTE)::GlobalLock(hDib);
if(pDib == NULL)
{
::GlobalFree(hDib);
return NULL;
}

memset(pDib, 0, nDibSize);

LPBITMAPFILEHEADER pBf = (LPBITMAPFILEHEADER)pDib;
pBf->bfType = 0x4D42;
pBf->bfSize = nDibSize;
pBf->bfReserved1 = 0;
pBf->bfReserved2 = 0;
pBf->bfOffBits = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ sizeof(RGBQUAD)*256/*8 depths*/; LPBITMAPINFOHEADER pBi = (LPBITMAPINFOHEADER)(pDib+sizeof(BITMAPFILEHEADER));
int iii=sizeof(BITMAPINFOHEADER);
  pBi->biSize = sizeof(BITMAPINFOHEADER);
pBi->biWidth = 1280;
pBi->biHeight = 1024;
pBi->biPlanes = 1;
pBi->biBitCount = 8;
pBi->biCompression = BI_RGB;
pBi->biSizeImage = 1024 * 1280;
pBi->biXPelsPerMeter = 0;
pBi->biYPelsPerMeter = 0;
pBi->biClrUsed = 0;
pBi->biClrImportant = 0; LPRGBQUAD lpRGB = (LPRGBQUAD)(pDib + sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER));
for(int i = 0; i < 256; i++)
{
lpRGB[i].rgbRed = lpRGB[i].rgbGreen = lpRGB[i].rgbBlue = (unsigned char)i;
}

LPBYTE pDibData;
pDibData = pDib + pBf->bfOffBits; hf=_lcreat("sobel.bmp",0);
_lwrite(hf,(LPSTR)&pBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)&pBi,sizeof(BITMAPINFOHEADER));
_lwrite(hf,(LPSTR)lpRGB,256*sizeof(RGBQUAD));
_lwrite(hf,(LPSTR)pDibData,pBi->biSizeImage);

::GlobalUnlock(hDib);
return hDib;