我写了下面一段代码,功能很简单,就是创建一幅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;
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;
解决方案 »
- 关于指向类的指针变量问题 void CTestView::OnDraw(CDC* pDC)
- 请教一个奇怪的问题!!
- 谁有 < <Visual C++开发经验技巧宝典>>的源码,给我一份好吗?
- 各位大神们,你们的工作电脑怎么样?
- 在列表框中显示oracle数据库中的空数据
- 向大家请教ATL开发COM组件中调用DLL的问题
- 哪位大侠用 IEC 870-5-101通信规约 写过程序啊?
- kugou123(酷狗)与vcmute(横秋)请进:原贴子给分时误删除了,我重新给分。
- 谁知道如何知道汉字内码来显示汉字??
- 请教有关VC带参数的菜单响应函数
- 有谁实现过类似组态软件功能的程序啊?
- 防火墙软件请各位看看?有什么问题?
_lwrite(hf,(LPSTR)&pBi,sizeof(BITMAPINFOHEADER));
变成
_lwrite(hf,pBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,pBi,sizeof(BITMAPINFOHEADER));
不要随便作类型转换
我自己调试了一下应改成
_lwrite(hf,(LPSTR)pBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)pBi,sizeof(BITMAPINFOHEADER));