我刚刚做了个8位位图的数据信息的函数,但是现实效果实在是令人看不下去。想从DDB转DIB这块下手,直接使用32或者24位的数据,不知道具体怎么填写位图信息头还有颜色数据怎么处理?
GetObject(pGdiNode->Gdi.hDIBitmap,sizeof(BITMAP),&(pGdiNode->Gdi.DIBitmap));
// 设置颜色模式
pGdiNode->Gdi.DIBitmap.bmBitsPixel = bmBitsPixel;//bmBitsPixel表示位数,初始位4位
// 初始化位图信息头
pGdiNode->Gdi.BMIH.biSize = sizeof(BITMAPINFOHEADER);
pGdiNode->Gdi.BMIH.biWidth = pGdiNode->Gdi.DIBitmap.bmWidth;
pGdiNode->Gdi.BMIH.biHeight = pGdiNode->Gdi.DIBitmap.bmHeight;
pGdiNode->Gdi.BMIH.biPlanes = 1;
pGdiNode->Gdi.BMIH.biBitCount = (WORD)pGdiNode->Gdi.DIBitmap.bmPlanes * (WORD)pGdiNode- >Gdi.DIBitmap.bmBitsPixel;
pGdiNode->Gdi.BMIH.biCompression = BI_RGB;
pGdiNode->Gdi.BMIH.biSizeImage = 0;
pGdiNode->Gdi.BMIH.biXPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biYPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biClrUsed = 0;
pGdiNode->Gdi.BMIH.biClrImportant = 0; //设置区域的颜色数
pGdiNode->Gdi.nColors = 1 << pGdiNode->Gdi.BMIH.biBitCount;
//由于初始设置为4位,所以不能大于255色
//16,32位的都可以大于255
if (pGdiNode->Gdi.nColors > 256)
//加入超过8位就可以不要颜色表
pGdiNode->Gdi.nColors = 0;
// 计算为位图信息头和彩色表分配内存所需的尺寸
pGdiNode->Gdi.dwLen = (DWORD)(sizeof(BITMAPINFOHEADER) + pGdiNode->Gdi.nColors * sizeof(RGBQUAD));
GetObject(pGdiNode->Gdi.hDIBitmap,sizeof(BITMAP),&(pGdiNode->Gdi.DIBitmap));
// 设置颜色模式
pGdiNode->Gdi.DIBitmap.bmBitsPixel = bmBitsPixel;//bmBitsPixel表示位数,初始位4位
// 初始化位图信息头
pGdiNode->Gdi.BMIH.biSize = sizeof(BITMAPINFOHEADER);
pGdiNode->Gdi.BMIH.biWidth = pGdiNode->Gdi.DIBitmap.bmWidth;
pGdiNode->Gdi.BMIH.biHeight = pGdiNode->Gdi.DIBitmap.bmHeight;
pGdiNode->Gdi.BMIH.biPlanes = 1;
pGdiNode->Gdi.BMIH.biBitCount = (WORD)pGdiNode->Gdi.DIBitmap.bmPlanes * (WORD)pGdiNode- >Gdi.DIBitmap.bmBitsPixel;
pGdiNode->Gdi.BMIH.biCompression = BI_RGB;
pGdiNode->Gdi.BMIH.biSizeImage = 0;
pGdiNode->Gdi.BMIH.biXPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biYPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biClrUsed = 0;
pGdiNode->Gdi.BMIH.biClrImportant = 0; //设置区域的颜色数
pGdiNode->Gdi.nColors = 1 << pGdiNode->Gdi.BMIH.biBitCount;
//由于初始设置为4位,所以不能大于255色
//16,32位的都可以大于255
if (pGdiNode->Gdi.nColors > 256)
//加入超过8位就可以不要颜色表
pGdiNode->Gdi.nColors = 0;
// 计算为位图信息头和彩色表分配内存所需的尺寸
pGdiNode->Gdi.dwLen = (DWORD)(sizeof(BITMAPINFOHEADER) + pGdiNode->Gdi.nColors * sizeof(RGBQUAD));
解决方案 »
- 点击对话框上的X会发送给对话框WM_DESTROY消息么?
- CListCtrl继承类不能Create
- 请问CListCtl不在工具栏,怎么才可以找到呀?
- 如何從DLL中導出窗體類。。。。?
- 我在ResourceView在新建了一ToolBar,我不想编辑图片,我如何将现有图片加入ResourceView中建的ToolBar中呢?
- 如何使托盘的上下文菜单响应快捷键?
- 请问,怎么扫描硬盘,得到文件名?????
- 一个关于类定义和实现的问题
- Activex控件的子线程新开窗口的问题
- W2000下类似于W95/98下的PDOS95的东西?我原来的TC程序怎么显示?
- 关于异常提示窗体,错误窗口
- 关于函数参数的问题
BITMAPFILEHEADER * DDBToOLDDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
//BitCount取值1,4,8,24//返回值最后须free掉
//把hBitmap转成DIB
{
BITMAP bm;
int iOffset, iSizeImage ;
BYTE *pBits;
BITMAPFILEHEADER *pbfh;
BITMAPCOREINFO *pbi;
if(NULL==hBitmap)
return NULL;
GetObject(hBitmap,sizeof(BITMAP),&bm);
switch(BitCount)
{
case 1:
case 4:
case 8:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER)+sizeof(RGBTRIPLE)*(1<<BitCount);
break;
case 24:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER);
break;
default:
return NULL;
}
iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight;
pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage);
if(NULL==pbfh)
return NULL;
pBits=(BYTE *)pbfh+iOffset;
pbi=(BITMAPCOREINFO *)(pbfh+1);
pbfh->bfType=0x4D42;
pbfh->bfSize=iOffset+iSizeImage;
pbfh->bfReserved1=0;
pbfh->bfReserved2=0;
pbfh->bfOffBits=iOffset; pbi->bmciHeader.bcSize=sizeof(BITMAPCOREHEADER);
pbi->bmciHeader.bcWidth=(WORD)bm.bmWidth;
pbi->bmciHeader.bcHeight=(WORD)bm.bmHeight;
pbi->bmciHeader.bcPlanes=1;
pbi->bmciHeader.bcBitCount=BitCount;
GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,(BITMAPINFO*)pbi,DIB_RGB_COLORS);
return pbfh;
}
BITMAPFILEHEADER * pbmfh=DDBToOLDDIB(hdc,hBitmap,24);
BYTE* pbit=(BYTE*)pbmfh+(pbmfh->bfOffBits);图素位指针
//处理代码;
free(pbmfh);