Gdiplus::Bitmap m_pbmpSrc; #define FANZHI 110 BYTE* GetBWDataFromGrayData(BYTE* pGrayData, int nWStride, int nWidth, int nHeight) { BYTE * pBWDat = new BYTE[nWidth*nHeight]; for (int i=0;i<nHeight;i++) { int nSrcRow = i*nWStride; int nDestRow = i*nWidth; for (int j=0;j<nWidth; j++) { if (pGrayData[nSrcRow+j] > FANZHI) { pBWDat[nDestRow+j] = 0xFF; //白 } else { pBWDat[nDestRow+j] = 0x00; } } } return pBWDat; } BYTE* GetGrayDataFromRGBData(BYTE* pRGBData, int nWStride, int nWidth, int nHeight) { BYTE * pGrayDat = new BYTE[nWidth*nHeight]; for (int i=0;i<nHeight;i++) { int nSrcRow = i*nWStride; int nDestRow = i*nWidth; for (int j=0;j<nWidth; j++) { BYTE bBlue = pRGBData[nSrcRow+j*3]; BYTE bGreen = pRGBData[nSrcRow+j*3+1]; BYTE bRed = pRGBData[nSrcRow+j*3+2]; //(R*299 + G*587 + B*114 + 500) / 1000 pGrayDat[nDestRow+j] = (bRed * 299 + bGreen * 587 + bBlue * 114+500) / 1000; //灰度计算公式 //pGrayDat[nDestRow+j] = (bRed * 19595 + bGreen * 38469 + bBlue * 7472) >> 16; //灰度计算公式 } } return pGrayDat; } int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // Failure } Gdiplus::Bitmap bt(L"F://test1.JPG"); Gdiplus::BitmapData bitdata; int w = bt.GetWidth(); int h = bt.GetHeight(); Gdiplus::Rect rect(0,0,w, h); bt.LockBits(&rect, ImageLockModeWrite, bt.GetPixelFormat(), &bitdata); BYTE* pData = (BYTE*)bitdata.Scan0; BYTE *pGaryData = GetGrayDataFromRGBData(pData, bitdata.Stride, w, h); if (pGaryData) { { if (m_pbmpSrc) { delete m_pbmpSrc; m_pbmpSrc = NULL; } BYTE *pBWData = GetBWDataFromGrayData(pGaryData, w, w, h); delete []pGaryData; if (pBWData) { m_pbmpSrc = new Bitmap(w,h, PixelFormat1bppIndexed); Gdiplus::BitmapData bdSrc; m_pbmpSrc->LockBits(&rect, ImageLockModeWrite, PixelFormat1bppIndexed, &bdSrc); BYTE * pDesData = (BYTE*)bdSrc.Scan0; for (int i=0; i<h; i++) { int nSrcRow = i*w; int nDstRow = i*bdSrc.Stride; #define SET_BYTE_BIT(b, bit) (b=((b) | (1<<bit))) for (int j=0; j<w; j++) { int n = j/8; int nBit = 7-j%8; // if (pBWData[nSrcRow+j] == 0xFF) { SET_BYTE_BIT(pDesData[nDstRow+n], nBit); //白 } } } m_pbmpSrc->UnlockBits(&bdSrc); delete []pBWData; } } } //GetImageDataFromGDIBWData(pData, bitdata.Stride, w, h); bt.UnlockBits(&bitdata); CLSID Clsid;//-------------------------------------------------------------------------------4 GetEncoderClsid(L"image/bmp", &Clsid);//----------------------------------------5 m_pbmpSrc->Save(L"F://ljztest.bmp", &Clsid);//-------------------------------------------------6 上面代码演示了从GDI+导入一张彩色图,然后将其转换成灰色图到黑白图. 直接修改GDI+的数据来显示到显示器上的过程.