求助! 如何能把24位的位图转为16色(4位) 可以这样实现:1、由hDC获取内存位图2、针对内存位图进行转换运算3、保存为16色的位图文件格式大部分代码可能都要写。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我这有一个hBitmap(DDB)转BITMAPFILEHEADER *(DIB)的函数;BitCount取值为1,4,8,16,24,32;BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount){ BITMAP bm; int iOffset, iSizeImage ; BYTE *pBits; BITMAPFILEHEADER *pbfh; BITMAPINFO *pbi; if(NULL==hBitmap) return NULL; GetObject(hBitmap,sizeof(BITMAP),&bm); switch(BitCount) { case 1: case 4: case 8: iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount); break; case 16: case 24: case 32: iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 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=(BITMAPINFO *)(pbfh+1); pbfh->bfType=0x4D42; pbfh->bfSize=iOffset+iSizeImage; pbfh->bfReserved1=0; pbfh->bfReserved2=0; pbfh->bfOffBits=iOffset; pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); pbi->bmiHeader.biWidth=bm.bmWidth; pbi->bmiHeader.biHeight=bm.bmHeight; pbi->bmiHeader.biPlanes=1; pbi->bmiHeader.biBitCount=BitCount; pbi->bmiHeader.biCompression=BI_RGB; pbi->bmiHeader.biSizeImage=iSizeImage; pbi->bmiHeader.biXPelsPerMeter=0; pbi->bmiHeader.biYPelsPerMeter=0; if(BitCount<16) { pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount); } else { pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0; } GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS); return pbfh;} 4楼那函数我是用来保存截屏下来的HBITMAP图到文件用的. 请大虾指教! 以前用VB,现学VC++,感觉思想构架都很困难,请高人指点一二,大家提建议! already has a body? 求Iphlpapi.h文件 如何引用变量名 能否定义自己的注册表文件? 请教CComboBox显示的问题!!!急!!! 我想编辑一个对话框程序,点击上面的按钮可以调用其他的EXE的可执行文件。请问,可以使用那些函数? MFC线程上下文时效问题 右键菜单问题 关于GIF 图片格式分析的问题 如何得到已经最小化的程序的线程
BITMAPFILEHEADER *(DIB)的函数;
BitCount取值为1,4,8,16,24,32;
BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
{
BITMAP bm;
int iOffset, iSizeImage ;
BYTE *pBits;
BITMAPFILEHEADER *pbfh;
BITMAPINFO *pbi;
if(NULL==hBitmap)
return NULL;
GetObject(hBitmap,sizeof(BITMAP),&bm);
switch(BitCount)
{
case 1:
case 4:
case 8:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount);
break;
case 16:
case 24:
case 32:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
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=(BITMAPINFO *)(pbfh+1);
pbfh->bfType=0x4D42;
pbfh->bfSize=iOffset+iSizeImage;
pbfh->bfReserved1=0;
pbfh->bfReserved2=0;
pbfh->bfOffBits=iOffset; pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth=bm.bmWidth;
pbi->bmiHeader.biHeight=bm.bmHeight;
pbi->bmiHeader.biPlanes=1;
pbi->bmiHeader.biBitCount=BitCount;
pbi->bmiHeader.biCompression=BI_RGB;
pbi->bmiHeader.biSizeImage=iSizeImage;
pbi->bmiHeader.biXPelsPerMeter=0;
pbi->bmiHeader.biYPelsPerMeter=0;
if(BitCount<16)
{
pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount);
}
else
{
pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0;
}
GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS);
return pbfh;
}