//pbyDDBDst 指向32位DDB指针
//nWidth 像素宽
//nHeight 像素高
BYTE * DDB32To1(BYTE* pbyDDBDst,int nWidth,int nHeight)
{
DWORD dwDIBSize;
DWORD dwDibBitsSize;
DWORD dwSaveWidthBytes;
DWORD dwFileSize;
//32位位图的像素的各个颜色分量的指针
BYTE *pbyBitEachRed;
BYTE *pbyBitEachBlue;
BYTE *pbyBitEachGreen;
BYTE byBitEachRed;
BYTE byBitEachBlue;
BYTE byBitEachGreen;
BYTE byBit;
BYTE *pbyBit;
long dbWidth;
int itmp;
int n;
//指向Ddb内存数据的指针(行)
BYTE* pbyDdbData;
//指向Dib内存数据的指针(行)
BYTE* pbyDibData ;
BYTE* pbyDibBits ;
int i,j;
DWORD dwBaseIndex; //32位图的指针的基准位置
DWORD dwIndexDib; //2位图的指针的基准位置
//指针指向获得的32位位图的像素的各个颜色分量的
pbyBitEachRed=&byBitEachRed;
pbyBitEachBlue=&byBitEachBlue;
pbyBitEachGreen=&byBitEachGreen;
//32位图像的宽度 字节数
dbWidth=((nWidth * 32 + 15) / 16) * 2;
//每行字节数必须被4整除
dwSaveWidthBytes=((nWidth + 31) / 32) * 4;
//DIB位图数据大小, 以字节为单位
dwDibBitsSize = dwSaveWidthBytes * nHeight;
//单色的位图的数据大小字节数
dwDIBSize=nWidth * nHeight/8 ;
pbyDibBits=(BYTE*)malloc(dwDIBSize);
if (pbyDibBits==NULL)
{
return FALSE;
}
//数据索引基数
dwBaseIndex =0;
dwIndexDib = (nHeight - 1) * dwSaveWidthBytes;//BMP图像为颠倒的,先把指针的位置指向最下的行,图像的第一行
byBit=255; //把要合为1字节的数据初始为白色
pbyBit=&byBit; //
for(i=0;i<nHeight;i++)
{
//指向Ddb内存数据的指针(行)
pbyDdbData = pbyDDBDst + dwBaseIndex;
//指向Dib内存数据的指针(行)
pbyDibData = pbyDibBits + dwIndexDib;
n=0;
for(j=0;j<nWidth;j++)
{
itmp=0;
n++;
//把32位的DDB数据变为2位的数据
*pbyBitEachBlue=*(pbyDdbData++); //蓝色
*pbyBitEachGreen=*(pbyDdbData++); //绿色
*pbyBitEachRed=*(pbyDdbData++); //红色
pbyDdbData++;
itmp=8-n;
//把小于200的变为黑色
//把4字节的数据合为1字节
if((*pbyBitEachBlue)<WHITEBLACKVALVE||(*pbyBitEachGreen)<WHITEBLACKVALVE||(*pbyBitEachRed)<WHITEBLACKVALVE)
{
BIT_CLEAR(byBit,itmp); //设置位为0 变为黑色
}
else
{
//BIT_CLEAR(byBit,itmp); //设置位为0 变为黑色
}
if (n==8)
{
//一字节的数据写入内存
n=0;
*pbyDibData++=*pbyBit;
byBit=255; //初始值为255 白色
}
}
dwBaseIndex =dwBaseIndex+ dbWidth;
dwIndexDib = dwIndexDib-dwSaveWidthBytes;
}
return pbyDibBits;
}
Value = Value / 128; // 这样这样
用两个DC,分别选定(Select)两个Bitmap,一个32位的,一个1位的,对着BitBlt()一下,不是很轻松愉快吗?