WORD wbitsCount;//位图中每个像素所占字节数。
DWORD dwpalettelsize=0;//调色板大小
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
if(wbitsCount<=8)
dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);不太明白这个代码
我打算使用单色的位图,那么这里应该如何编写还有下面这个函数,是从DDB转换成DIB的
不过由于没有注释,不太会使用
对于函数的各个形参,我的理解是
HBITMAP hbm:是将要被转换的位图的句柄
HPALETTE hpal: 这个应该是使用者创建的调色板的结构的句柄吧
HDC hdc:这个应该是使用者创建的设备环境的句柄
剩下两个就不太明白了
感觉 WORD biBits 应该是设置图片是多少色的
DWORD biStyle 就完全不理解了还有这个函数到底如何用?
是不是传入位图的句柄,自己创建的调色板的句柄,创建的设备环境的句柄,还有剩下两个参数
但是这个函数返回一个句柄,想不通怎么转换成DIB了
望各位大虾指教HANDLE DibFromBitmap (HBITMAP hbm,DWORD biStyle,WORD biBits,HPALETTE hpal,HDC hdc)
{
BITMAP bm;
BITMAPINFOHEADER bi;
BITMAPINFOHEADER FAR *lpbi;
DWORD dwLen;
HANDLE hdib;
HANDLE h; if (!hbm)
return NULL; if (hpal == NULL)
hpal = (HPALETTE)GetStockObject(DEFAULT_PALETTE); GetObject(hbm,sizeof(bm),(LPSTR)&bm); if (biBits == 0)
biBits = bm.bmPlanes * bm.bmBitsPixel; bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = biBits;
bi.biCompression = biStyle;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwLen = bi.biSize + PaletteSize(&bi); hpal = SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc); hdib = GlobalAlloc(GHND,dwLen); if (!hdib){
SelectPalette(hdc,hpal,FALSE);
::ReleaseDC(NULL,hdc);
return NULL;
} lpbi = (tagBITMAPINFOHEADER *)(VOID FAR *)GlobalLock(hdib); *lpbi = bi; GetDIBits(hdc, hbm, 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS); bi = *lpbi;
GlobalUnlock(hdib); if (bi.biSizeImage == 0){
bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * biBits) * bm.bmHeight; if (biStyle != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
} dwLen = bi.biSize + PaletteSize(&bi) + bi.biSizeImage;
if (h = GlobalReAlloc(hdib,dwLen,0))
hdib = h;
else{
GlobalFree(hdib);
hdib = NULL; SelectPalette(hdc,hpal,FALSE);
return hdib;
} lpbi = (tagBITMAPINFOHEADER *)(VOID FAR *)GlobalLock(hdib); if (GetDIBits( hdc,
hbm,
0L,
(DWORD)bi.biHeight,
(LPBYTE)lpbi + (WORD)lpbi-> biSize + PaletteSize(lpbi),
(LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS) == 0){
GlobalUnlock(hdib);
hdib = NULL;
SelectPalette(hdc,hpal,FALSE);
return NULL;
}
bi = *lpbi;
GlobalUnlock(hdib);
SelectPalette(hdc,hpal,FALSE);
return hdib;
} BOOL WriteDIB (LPSTR szFile, HANDLE hdib)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
HFILE fh;
OFSTRUCT of; if (!hdib)
return FALSE; fh = OpenFile(szFile, &of, (UINT)OF_CREATE|OF_READWRITE);
if (fh == -1)
return FALSE; lpbi = (tagBITMAPINFOHEADER *)(VOID FAR *)GlobalLock (hdib); hdr.bfType = BFT_BITMAP;
hdr.bfSize = GlobalSize (hdib) + SIZEOF_BITMAPFILEHEADER_PACKED;
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (SIZEOF_BITMAPFILEHEADER_PACKED + lpbi-> biSize +
PaletteSize(lpbi));
#ifdef FIXDWORDALIGNMENT
_lwrite(fh, (LPSTR)&hdr, (UINT)(SIZEOF_BITMAPFILEHEADER_PACKED));
#else
WriteMapFileHeaderandConvertFromDwordAlignToPacked(fh, &hdr);
#endif _lwrite (fh, (LPSTR)lpbi, GlobalSize (hdib));
GlobalUnlock (hdib);
GlobalFree (hdib);
_lclose(fh);
return TRUE;
}
解决方案 »
- MFC用ADO连接远程oracle11g的方法是什么?连接字符串是什么?我用的是vs2010.
- bmp文件保存为新文件后,不能显示和原文件一样的色彩
- PeekMessage的参数问题
- 能得知任一程序弹出的对话框是何种类型吗?
- 关于打印的问题,高手请关注
- 请教:在Win2000中怎样提升一个进程的权限
- 如何向常规dll中传送CString参数
- [求助]MFC 类库大全的电子版
- 问:如何判断一个字符串是否是盘符?
- 我在DOS下可以PING网络,为什么在VC中调用rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)返回错误值呢??请指教,很着急
- 工具提示,能不能控制其在什么消息下显示?
- 有关多媒体应用程序
void WriteMapFileHeaderandConvertFromDwordAlignToPacked(HFILE fh, LPBITMAPFILEHEADER pbf)
{
_lwrite(fh, (LPSTR)&pbf-> bfType, (UINT)sizeof (WORD));
_lwrite(fh, (LPSTR)&pbf-> bfSize, sizeof(DWORD) * 3);
}
256色是8(2的8次方),16色是4, 黑白图是1, 彩色图为32 DWORD dwpalettelsize=0;//调色板大小
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
if(wbitsCount<=8)
dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);1<<wbitsCount 即2的wbitsCount 次方, 256色为 2的8次方 =256