为什么是反色?
sunnf 2002-12-03 08:48:39 我用以下的方法生成二值位图,再用SetDIBitsToDevice显示图像时是黑白颠倒。
shImageWidthBitsSize = (shImageWidth +31) / 32 * 4;
/* Create Bitmap Data */
pbyBitInfoHeader = (BYTE*)malloc(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD) +
shImageWidthBitsSize * shImageHeight);
/* Return point to Bitmap */
*ppBmfh = (BITMAPFILEHEADER*)pbyBitInfoHeader;
if (*ppBmfh == NULL)
return -1; //???? later ....
pBmfh = (BITMAPFILEHEADER*)*ppBmfh;
pBmfh->bfType = ((WORD)('M' << 8 | 'B'));
pBmfh->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD) +
shImageWidthBitsSize * shImageHeight;
pBmfh->bfReserved1 = 0;
pBmfh->bfReserved2 = 0;
pBmfh->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD);
pbmi=(BITMAPINFO*)((BITMAPFILEHEADER*)(*ppBmfh+1));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth=shImageWidth;
pbmi->bmiHeader.biHeight=shImageHeight;
pbmi->bmiHeader.biClrUsed=0;
pbmi->bmiHeader.biPlanes=1;
pbmi->bmiHeader.biCompression=0;
pbmi->bmiHeader.biSizeImage=0;
pbmi->bmiHeader.biXPelsPerMeter=0;
pbmi->bmiHeader.biYPelsPerMeter=0;
pbmi->bmiHeader.biClrUsed=0;
pbmi->bmiHeader.biClrImportant=0;
pbmi->bmiHeader.biBitCount=1;
pbmi->bmiColors[0].rgbBlue=0;
pbmi->bmiColors[0].rgbGreen=0;
pbmi->bmiColors[0].rgbRed=0;
pbmi->bmiColors[0].rgbReserved=0;
pbmi->bmiColors[1].rgbBlue=255;
pbmi->bmiColors[1].rgbGreen=255;
pbmi->bmiColors[1].rgbRed=255;
pbmi->bmiColors[1].rgbReserved=0;
pbyImageDataTmp = (BYTE*)*ppBmfh + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD);
memcpy((BYTE*)pbyImageDataTmp,lpImageData,shImageWidthBitsSize * shImageHeight*sizeof(BYTE));
*****************************
用以下的方法显示图像时是黑白颠倒。
BITMAPFILEHEADER* pBmfh;
BITMAPFILEHEADER** ppBmfh=&pBmfh;
HDC hDC=::GetDC(m_hWnd);
BITMAPFILEHEADER* bmHeader=(BITMAPFILEHEADER *)pBmfh;
int iOffBits=bmHeader->bfOffBits;
BITMAPINFO* bmInfo=(LPBITMAPINFO)((BITMAPFILEHEADER *)(pBmfh+1));
int nWidth = bmInfo->bmiHeader.biWidth;
int nHeight = bmInfo->bmiHeader.biHeight;
BYTE* pbyImage1=(BYTE*)(pBmfh) + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO)+sizeof(RGBQUAD);
SetDIBitsToDevice(hDC,0,0,nWidth,nHeight,0,0,0,nHeight,pbyImage1,(BITMAPINFO*)bmInfo,DIB_RGB_COLORS);