如何对两幅bmp图像进行异或运算?

koko200147 2008-03-21 03:09:52
我现在已经得到两幅bmp图像,想对里面每一个像素点进行异或操作,去掉其中的相同部分,保留下不同的部分到ChangedBitmap里,不过现在得到的是全黑的图片,代码如下,请各位高手赐教!

LPVOID m_newlpvBits = NULL, m_oldlpvBits = NULL;

char *m_newcbBuffer = NULL, *m_oldcbBuffer = NULL;
HDC hDC, hDC_old, newhdc = NULL, oldhdc = NULL;
BITMAP bb, bb1;
BITMAPINFO b, b1;
HANDLE hp, fh=NULL;
DWORD dwX, dwY;



//***************
dwX=GetSystemMetrics(SM_CXSCREEN);
dwY=GetSystemMetrics(SM_CYSCREEN);


hDC=::GetDC(NULL);
hDC_old = ::GetDC(NULL);
newhdc=CreateCompatibleDC(hDC);
oldhdc=CreateCompatibleDC(hDC_old);

bb.bmWidth=dwX;
bb.bmHeight =dwY;
bb.bmPlanes = 1;
bb.bmWidthBytes=bb.bmWidth*3;
bb.bmBitsPixel=3;
bb.bmType=0;

b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=dwX;
b.bmiHeader.biHeight =dwY;
b.bmiHeader.biPlanes = 1;
b.bmiHeader.biBitCount =24;
b.bmiHeader.biCompression = BI_RGB;
b.bmiHeader.biSizeImage = 0;
b.bmiHeader.biXPelsPerMeter = 0;
b.bmiHeader.biYPelsPerMeter = 0;
b.bmiHeader.biClrUsed = 0;
b.bmiHeader.biClrImportant = 0;

b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;

hp=GetProcessHeap();

bb1 =bb;
b1 = b;

m_newcbBuffer=(char *)HeapAlloc(hp, HEAP_ZERO_MEMORY, bb.bmHeight*bb.bmWidth*4);
m_oldcbBuffer=(char *)HeapAlloc(hp, HEAP_ZERO_MEMORY, bb1.bmHeight*bb1.bmWidth*4);

ChangedBitmap=CreateCompatibleBitmap(newhdc, bb.bmWidth, bb.bmHeight);
HBITMAP hOldBitmap;
hOldBitmap=(HBITMAP)SelectObject(newhdc, ChangedBitmap);

GetDIBits(newhdc, newBitmap, 0, dwY, m_newcbBuffer, &b, DIB_RGB_COLORS);
GetDIBits(oldhdc, oldBitmap, 0, dwY, m_oldcbBuffer, &b1, DIB_RGB_COLORS);

::BitBlt(newhdc, 0, 0, bb.bmWidth, bb.bmHeight, oldhdc, 0, 0, SRCCOPY);

ChangedBitmap=(HBITMAP)SelectObject(newhdc, hOldBitmap);
char * ChangecbBuffer=(char *)HeapAlloc(hp, HEAP_ZERO_MEMORY, bb.bmHeight*bb.bmWidth*4);
GetDIBits(newhdc, ChangedBitmap, 0, dwY, ChangecbBuffer, &b, DIB_RGB_COLORS);
...全文
1027 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhihuixiaoqiang 2008-11-04
  • 打赏
  • 举报
回复
异或的作用是什么?
yebeans 2008-03-24
  • 打赏
  • 举报
回复
我也不知道有什么书专业讲这个的~~有谁知道也指点下·~一般就是找个例子,然后参考着改改·
这个你要一步一步来,先不管SRCINVERT ,先保证能正确绘制一个图出来,然后绘两个,然后再SRCINVERT。
在正确的基础上再往后进行,要不牵扯的地方太多你也不好调。
koko200147 2008-03-24
  • 打赏
  • 举报
回复
To yebeans :
我用了SRCINVERT 试过,结果一样,小弟对这个DC一知半解,不知道如何使用,有什么好书介绍这个东西吗?
koko200147 2008-03-24
  • 打赏
  • 举报
回复
多谢指点啦。散分结帖。
kaizitop 2008-03-23
  • 打赏
  • 举报
回复
调试跟踪一下吧
yebeans 2008-03-22
  • 打赏
  • 举报
回复
BitBlt参数用 SRCINVERT :Combines the colors of the source and destination rectangles by using the Boolean XOR operator.
为黑多半是位图操作有问题(没取出来或者没画出来)。
cusang 2008-03-22
  • 打赏
  • 举报
回复
只能逐点运算

19,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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