为什么是反色?

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);
...全文
261 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
llm308 2002-12-04
  • 打赏
  • 举报
回复
gz
sunnf 2002-12-04
  • 打赏
  • 举报
回复
我知道的这样改是可以的,但标准做法是什么样的?
但是这样的数据用其他的方法显示没有问题!
foxmail 2002-12-03
  • 打赏
  • 举报
回复
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[0].rgbBlue=255;
pbmi->bmiColors[0].rgbGreen=255;
pbmi->bmiColors[0].rgbRed=255;
pbmi->bmiColors[0].rgbReserved=0;
pbmi->bmiColors[1].rgbBlue=0;
pbmi->bmiColors[1].rgbGreen=0;
pbmi->bmiColors[1].rgbRed=0;

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧