//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;
}

解决方案 »

  1.   

    错咯错咯Value = 0.299*R + 0.587*G + 0.114*B;
    Value = Value / 128; // 这样这样
      

  2.   

    这个32位的DDB是黑白的条形码,我只是想把它转为2色的,在一个值以下都是黑色。
      

  3.   

    在应用程序中正确,放入DLL中不正确,什么也没有,或是杂色
      

  4.   

    真费劲!
    用两个DC,分别选定(Select)两个Bitmap,一个32位的,一个1位的,对着BitBlt()一下,不是很轻松愉快吗?
      

  5.   

    我觉得你得程序没什么问题,放入DLL中后,试试函数头改成下面这样,看行不行:LPVOID DDB32To1(LPVOID pbyDDBDst,int nWidth,int nHeight)