求助~怎么用GDI+和vc++实现Windows画图里的改变图像像素的功能(如图)? 5
1个回答
展开全部
您好,BitBlt()函数有位图异或功能
将一个位图用BitBlt的异或方式画到另一个位图上,结果就是异或的。如果两幅图像是完全一样的,异或出来则是一个空的BYTE数组,图标被使用BYTE的数组方式进行比较
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
BYTE *lpDib;
BYTE *lpBase;
BITMAPINFOHEADER bi;
DWORD dwLen;
DibInfo (Orghdib, &bi);
dwLen = GlobalSize (Orghdib);
lpDib = (BYTE *)GlobalLock(Orghdib);
lpDib += (DWORD)bi.biSize + PaletteSize((LPSTR)&bi);
lpBase = (BYTE *)GlobalLock (Tarhdib);
lpBase += (DWORD)bi.biSize + PaletteSize((LPSTR)&bi);
dwLen = dwLen - bi.biSize - PaletteSize((LPSTR)&bi);
while (dwLen--)
{/*
if( *lpDib >= (int)(debasehow*(*lpBase)) )
*lpDib -= (int)(debasehow*(*lpBase));
else
*lpDib = 0; */
在本处加入异或操作: *lpDig ^= lpBase;
lpDib ++;
lpBase ++;
}
GlobalUnlock (Orghdib);
GlobalUnlock (Tarhdib);
最后看lpDig的值就行了。
将一个位图用BitBlt的异或方式画到另一个位图上,结果就是异或的。如果两幅图像是完全一样的,异或出来则是一个空的BYTE数组,图标被使用BYTE的数组方式进行比较
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
BYTE *lpDib;
BYTE *lpBase;
BITMAPINFOHEADER bi;
DWORD dwLen;
DibInfo (Orghdib, &bi);
dwLen = GlobalSize (Orghdib);
lpDib = (BYTE *)GlobalLock(Orghdib);
lpDib += (DWORD)bi.biSize + PaletteSize((LPSTR)&bi);
lpBase = (BYTE *)GlobalLock (Tarhdib);
lpBase += (DWORD)bi.biSize + PaletteSize((LPSTR)&bi);
dwLen = dwLen - bi.biSize - PaletteSize((LPSTR)&bi);
while (dwLen--)
{/*
if( *lpDib >= (int)(debasehow*(*lpBase)) )
*lpDib -= (int)(debasehow*(*lpBase));
else
*lpDib = 0; */
在本处加入异或操作: *lpDig ^= lpBase;
lpDib ++;
lpBase ++;
}
GlobalUnlock (Orghdib);
GlobalUnlock (Tarhdib);
最后看lpDig的值就行了。
追问
你好,这个代码没怎么看懂,能解释下吗?
而且这个异或操作与改变图像像素有什么联系吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询